2014-08-28 114 views
0

我在我的C#程序中使用Xml遇到麻煩。C#解析Xml選擇節點

http://pastebin.com/Ufxaght6(沙盒)

我試圖獲得對XML的任何信息,我成功了使用上的節點遞歸循環的XML,但我想用的東西更有效。

我想這一點:

XmlDocument document = new XmlDocument(); 
     document.LoadXml(response); 

     XmlNode node = document.SelectSingleNode("/getnewsalesresult/request/user"); 
     if (node != null) 
      Logger.WriteLine(node.InnerText); 
     else 
      Logger.WriteLine("fail"); 

這總是給人一種空。 我認爲問題來自'getnewsalesresult'(通配符也許?)。

從XML:

<getnewsalesresult xmlns="http://www.sandbox.priceminister.com/res/schema/getnewsales" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

XSI:的schemaLocation = 「http://www.sandbox.priceminister.com/res/schema/getnewsales http://www.sandbox.priceminister.com/res/schema/getnewsales/getnewsales.2014-02-11.xsd」>

任何想法?

在此先感謝。

+0

我懷疑這是一個命名空間問題。嘗試http://stackoverflow.com/questions/1145659/ignore-namespaces-in-linq-to-xml – AaronLS 2014-08-28 14:59:07

+0

我不想成爲勺子飼料,但我不知道如何開始爲此:) – 2014-08-28 15:04:48

+0

SelectSingleNode需要xpath,首先從測試第一級開始:'document.SelectSingleNode(「/ getnewsalesresult」);'如果它不返回任何東西try'document.SelectSingleNode(「/ [local-name()='getnewsalesresult']」 );''或'document.SelectSingleNode(「/ * [local-name()='getnewsalesresult']」);' – AaronLS 2014-08-28 15:12:48

回答

0

您的XML具有默認名稱空間(xmlns="...")。默認名稱空間具有不同的性質。聲明缺省名稱空間的元素及其所有後代無前綴且沒有在相同默認名稱空間中考慮不同名稱空間聲明的元素。

在命名空間獲得元素最簡單的方法就是忽略命名空間(如評論也提出了這個問題):

string xpath = "/*[local-name()='getnewsalesresult']/*[local-name()='request']/*[local-name()='user']"; 
XmlNode node = document.SelectSingleNode(xpath); 

更合適的方式是要註冊映射到默認前綴命名空間URI,然後使用該前綴在您的XPath:

XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable()); 
ns.AddNamespace("d", "http://www.sandbox.priceminister.com/res/schema/getnewsales"); 
XmlNode node = 
     document.SelectSingleNode("/d:getnewsalesresult/d:request/d:user", ns); 

不要錯過傳遞XmlNamespaceManager對象的SelectSingleNode()第二個參數。