2013-03-22 165 views
0

嗨,下面是我使用的xml示例。我已經通過allsorts的選項,我可以想到能夠在personData節點開始並迭代結果,並且我似乎無法嘗試,除非我從根節點通過每個子節點手動導航。任何人都可以對我怎麼能做到這一點建議沒有從根開始使用XPathNavigator循環遍歷節點

我的代碼目前是

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> 

回答

3

我知道你正在使用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(); 
     } 
    } 
} 
給一個
0

你只是問你如何可以通過personData節點迭代不列出完整的路徑?如果這是你想做的事,你可以這樣做:

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