извлекать данные XML с использованием C # и XML DOM - PullRequest
1 голос
/ 27 июня 2011

У меня есть XML, который выглядит так:

<dfs:dataFields>
<d:REQUIREMENT_SPECIFICATION ProjectName="Test 1" ProjectWorkCode="909"     
FunctionDepartmentName="X department" BrandApplicableName="All" ProjectManagerName="" 
ProjectSponserName="" BackgroundDescription="others and users use the Online tool   to&#xA;to add users" 
StepChangeGoalDescription="In 2011, the new service will be active" ServiceImpactedName="xy service" 
xdado:OJsZDA="0">
</d:REQUIREMENT_SPECIFICATION>
</dfs:dataFields>

Мне нужно извлечь данные, которые находятся в кавычках.Например, я хочу, чтобы он распечатал: Спецификация требования Название проекта: Test 1 ProjectWorkCode: 909 FunctionDepartmentName: X кафедра ...... и т. Д. *

Я использую следующий код.он печатает d: REQUIREMENT_SPECIFICATION и dfs: dataFields, но больше ничего не печатает.

        XPathNavigator nav;
        XPathDocument docNav;

        docNav = new XPathDocument("test.xml");
        nav = docNav.CreateNavigator();
        nav.MoveToRoot();

        //Move to the first child node (comment field).
        nav.MoveToFirstChild();

        do
        {
            //Find the first element.
            if (nav.NodeType == XPathNodeType.Element)
            {
                //Determine whether children exist.
                if (nav.HasChildren == true)
                {

                    //Move to the first child.
                    nav.MoveToFirstChild();

                    Console.WriteLine(nav.Name);
                    Console.WriteLine(nav.Value);

                    //Loop through all of the children.
                    do
                    {
                        //Display the data.
                        nav.MoveToFirstChild();
                        Console.WriteLine(nav.Name);
                        Console.WriteLine(nav.Value);


                    } while (nav.MoveToNext());
                }
            }
        } while (nav.MoveToNext());
        //Pause.
        Console.ReadLine();

Не могли бы вы указать мне правильное направление?

Ответы [ 3 ]

1 голос
/ 27 июня 2011

Я предпочитаю использовать XmlDocument для таких случаев. Вы можете определить метод, который загружает XML в документе и просто возвращает корневой узел, а в основном методе просто циклически перебирайте атрибуты узла:

private void ProcessAndDumpXml()
{
    StreamReader xmlStream = new StreamReader("example1.xml");
    XmlNode root = GetRootNode(xmlStream);

    // process nodes
    // ...
}

private XmlNode GetRootNode(StreamReader streamReader)
{            
    XmlDocument xmlDocument = new XmlDocument();            
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());
    nsmgr.AddNamespace("dfs", "schema1");
    nsmgr.AddNamespace("d", "schema1");
    nsmgr.AddNamespace("xdado", "schema1");
    XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
    XmlReaderSettings xset = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
    XmlReader rd = XmlReader.Create(streamReader, xset, context);
    xmlDocument.Load(rd);

    return xmlDocument.DocumentElement.FirstChild;
}
0 голосов
/ 27 июня 2011

Отправленный вами документ не является допустимым XML-документом, поскольку в нем отсутствуют спецификации пространства имен. Но если предположить, что пространства имен присутствуют, вы можете сделать это, используя LINQ to XML, например:

var doc= XDocument.Load(xmlFile);

XNamespace dNs = "http://actual-d-namespace-uri";

foreach(var element in doc.Root.Elements(dNs + "REQUIREMENT_SPECIFICATION"))
{
    var attributes = element.Attributes()
                            .Select(a => string.Format("{0}: {1}", a.Name, a.Value));

    Console.WriteLine("Requirement Specification " + string.Join(" ", attributes));
}
0 голосов
/ 27 июня 2011

Помимо циклического перебора дочерних элементов, вам также необходимо перебирать атрибуты каждого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...