C# 使用XPathNavigator在节点间循环

C# 使用XPathNavigator在节点间循环,c#,xml,xpath,C#,Xml,Xpath,下面是我正在使用的xml示例。为了能够从personData节点开始并迭代结果,我已经考虑了各种各样的选项,除非我从根节点开始手动浏览每个子节点,否则我似乎什么都做不到。有谁能建议我如何做到这一点而不从根本上开始 我的代码目前是 using (var r = File.OpenText(@"C:\S\sp.xml")) { XPathDocument document = new XPathDocument(XmlReader.Create(r));

下面是我正在使用的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


IG2
2013年3月21日星期四15:56:42 GMT
2
史密斯街37号
县-37
Po12 123
弗莱德
布洛格斯
H1
3.
2000-04-25
AN@AN.AOM
2003-09-03
史密斯街37号
县-37
Po12 123
约翰
布洛格斯
H1
3.
1999-04-25
AN@AN.AOM
2003-09-03

您是否只是在问如何在不列出完整路径的情况下遍历
personData
节点?如果这是你想做的,你可以这样做:

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

您只是在问如何在不列出完整路径的情况下遍历
personData
节点?如果这是你想做的,你可以这样做:

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

我知道您正在使用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();
        }
    }
}

我知道您正在使用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();
        }
    }
}