2012-02-19 49 views
1

試圖解析這一點:通過XmlDocument的需要XPath表達式循環

<?xml version="1.0" encoding="UTF-8"?> 
<directoryresponse xmlns="https://www.sisow.nl/Sisow/REST" version="1.0.0"> 
    <directory> 
     <issuer> 
      <issuerid>01</issuerid> 
      <issuername>ABN Amro Bank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>02</issuerid> 
      <issuername>ASN Bank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>04</issuerid> 
      <issuername>Friesland Bank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>05</issuerid> 
      <issuername>ING</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>06</issuerid> 
      <issuername>Rabobank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>07</issuerid> 
      <issuername>SNS Bank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>08</issuerid> 
      <issuername>RegioBank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>09</issuerid> 
      <issuername>Triodos Bank</issuername> 
     </issuer> 
     <issuer> 
      <issuerid>10</issuerid> 
      <issuername>Van Lanschot Bankiers</issuername> 
     </issuer> 
    </directory> 
</directoryresponse> 

這裏是我的代碼:

XPath = "//directoryresponse/directory/issuer/issuerid" 
Dim nodeList As XmlNodeList = XML.SelectNodes(XPath) 

但nodelist.count = 0 ...爲什麼?

+0

感謝您抽出寶貴的時間來格式化XML,所以我們可以讀它。 – 2012-02-19 20:06:36

回答

2

你的XML有默認命名空間,所以你的代碼應該是:
C#:

var doc = new XmlDocument(); 
doc.Load("a.xml"); 

XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable); 
mgr.AddNamespace("ns", "https://www.sisow.nl/Sisow/REST"); 

var result = doc.SelectNodes("//ns:issuer/ns:issuerid", mgr); 

foreach (XmlElement item in result) 
{ 
    Console.WriteLine(item.InnerText); 
} 

VB.NET:

Dim doc As New XmlDocument 
doc.Load("a.xml") 

Dim mgr As New XmlNamespaceManager(doc.NameTable) 
mgr.AddNamespace("ns", "https://www.sisow.nl/Sisow/REST") 

Dim result As XmlNodeList = doc.SelectNodes("//ns:issuer/ns:issuerid", mgr) 

Dim item As XmlElement 
For Each item In result 
    Console.WriteLine(item.InnerText) 
Next 
+0

好的,謝謝! 然後我將如何選擇所有發行者,然後爲所有發行者獲取底層節點值? 我嘗試各種事情: 昏暗結果作爲XmlNodeList中= XML.SelectNodes( 「// NS:發行者」,MGR) 昏暗項作爲的XmlElement 爲每個項目在結果 Console.WriteLine(item.SelectSingleNode(「/ NS: issuerid」,MGR).InnerText) Console.WriteLine(item.SelectSingleNode( 「/ issuerid」)的innerText) Console.WriteLine(item.SelectSingleNode( 「issuerid」)的innerText) 接着 – Flo 2012-02-19 15:54:16

+0

@Floran,使用:' item.SelectSingleNode(「ns:issuerid」,mgr).InnerText',即XPath應該是'ns:issuerid'而不是'/ ns:issuerid'或'/ issuerid'。考慮upvoting或接受有用的答案。 – 2012-02-19 19:29:00

+0

謝謝!是的,在問題解決之後,我總是這樣做,現在就是這樣! – Flo 2012-02-19 19:56:49

-1

您可以簡化您的XPath來:

XPath = "//issuerid"; 
+0

我現在有這個,但nodeList.Count仍然是0: Dim url As String =「http://www.sisow.nl/Sisow/iDeal/RestHandler.ashx/DirectoryRequest」 Dim req As HttpWebRequest = HttpWebRequest.Create (url.ToString) 昏暗RESP作爲HttpWebResponse = req.GetResponse() 昏暗讀取器如的StreamReader =新的StreamReader(Resp.GetResponseStream) 昏暗responseString作爲字符串= reader.ReadToEnd() 昏暗XML作爲新的XmlDocument XML.LoadXml (responseString) Dim XPath As String =「// issuerid」 Dim nodeList As XmlNodeList = XML.SelectNodes(XPath) – Flo 2012-02-19 13:56:32