繁体   English   中英

使用XPathNavigator遍历节点

[英]Looping through nodes with XPathNavigator

您好,下面是我正在使用的xml示例。 我经历过各种各样的选择,我可以想到它们可以从personData节点开始并迭代结果,除非我手动从根向下遍历每个子节点,否则似乎没有任何尝试可行。 任何人都可以建议我如何做到这一点而无需从根本上开始

我的代码目前是

using (var r = File.OpenText(@"C:\S\sp.xml"))
        {
            XPathDocument document = new XPathDocument(XmlReader.Create(r));
            XPathNavigator xPathNav = document.CreateNavigator();

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xPathNav.NameTable);
            nsmgr.AddNamespace("g2", "http://person.transferobject.com/xsd");

            XPathNodeIterator xni = xPathNav.Select("/g2:companys/g2:company/g2:person/g2:personData", nsmgr);

            foreach (XPathNavigator nav in xni)
                Console.WriteLine(nav.Name);
        }

Xml

<?xml version="1.0" encoding="UTF-8"?>
<Header xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<dataSource xmlns="http://person.transferobject.com/xsd">IG2</dataSource>
<dateTime xmlns="http://person.transferobject.com/xsd">Thu Mar 21 15:56:42 GMT 2013</dateTime>
<formatVersion xmlns="http://person.transferobject.com/xsd">2.0</formatVersion>
<companys xmlns="http://person.transferobject.com/xsd">
<company>
    <errorMessages xsi:nil="true"/>
    <person>
        <personData>
            <address>
                <address1 xmlns="http://transferobject.com/xsd">37 Smith St</address1>
                <county xmlns="http://transferobject.com/xsd">COUNTY-37</county>
                <postcode xmlns="http://transferobject.com/xsd">Po12 123</postcode>
            </address>
            <basicDetails>
                <currentFirstName xmlns="http://transferobject.com/xsd">Fred</currentFirstName>
                <currentLastName xmlns="http://transferobject.com/xsd">Bloggs</currentLastName >
                <currentStage xmlns="http://transferobject.com/xsd">H1</currentStage>
                <currentGroup xmlns="http://transferobject.com/xsd">3</currentGroup>
                <dob xmlns="http://transferobject.com/xsd">2000-04-25</dob>
                <email xmlns="http://transferobject.com/xsd">AN@AN.AOM</email>
                <entryDate xmlns="http://transferobject.com/xsd">2003-09-03</entryDate>
            </basicDetails>
        </personData>
        <personData>
            <address>
                <address1 xmlns="http://transferobject.com/xsd">37 Smith St</address1>
                <county xmlns="http://transferobject.com/xsd">COUNTY-37</county>
                <postcode xmlns="http://transferobject.com/xsd">Po12 123</postcode>
            </address>
            <basicDetails>
                <currentFirstName xmlns="http://transferobject.com/xsd">John</currentFirstName>
                <currentLastName xmlns="http://transferobject.com/xsd">Bloggs</currentLastName >
                <currentStage xmlns="http://transferobject.com/xsd">H1</currentStage>
                <currentGroup xmlns="http://transferobject.com/xsd">3</currentGroup>
                <dob xmlns="http://transferobject.com/xsd">1999-04-25</dob>
                <email xmlns="http://transferobject.com/xsd">AN@AN.AOM</email>
                <entryDate xmlns="http://transferobject.com/xsd">2003-09-03</entryDate>
            </basicDetails>
        </personData>
    </person>
</company>
</companys>
</header>

我知道您正在使用XPath,但是当您有了XPath的答案时,我将使用Linq

using System;
using System.Linq;
using System.Xml.Linq;

namespace xmlTest
{
    class Program
    {
        static void Main()
        {
            XDocument doc = XDocument.Load("C:\\Users\\me\\Desktop\\so.xml");
            var personDataDetails = (from p in doc.Descendants().Elements()                                     
                                     where p.Name.LocalName == "personData"
                                         select p);

            foreach (var item in personDataDetails)
            {
                Console.WriteLine(item.ToString());
            }

            Console.ReadKey();
        }
    }
}

您是否只是问您如何遍历personData节点而不列出完整路径? 如果这是您要执行的操作,则可以执行以下操作:

XPathNodeIterator xni = xPathNav.Select("//g2:personData", nsmgr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM