2012-02-19 53 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