level_zebra
level_zebra

Reputation: 1533

Looping through nodes with XPathNavigator

Hi below is a sample of the xml i am using. I been through allsorts of options I can think of to be able to start at the personData node and iterate the results, and nothing i seem to try works unless I navigate manually through each child node from the root down. Can anyone advise on how I can do this without starting at the root

My code currently is

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">[email protected]</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">[email protected]</email>
                <entryDate xmlns="http://transferobject.com/xsd">2003-09-03</entryDate>
            </basicDetails>
        </personData>
    </person>
</company>
</companys>
</header>

Upvotes: 0

Views: 3970

Answers (2)

Dave
Dave

Reputation: 8461

I know you're using XPath, but as you have an answer with XPath I'll give one using 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();
        }
    }
}

Upvotes: 3

JLRishe
JLRishe

Reputation: 101690

Are you just asking how you can iterate through the personData nodes without listing the full path? If that's what you want to do, you can just do this:

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

Upvotes: 0

Related Questions