2011-06-06 82 views
1

我在Resources.xmltest以下XML:C#XML值總是越來越空

<?xml version="1.0" encoding="utf-8" ?> 
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://DFISofft.com/SmartPayments/"> 
    <Result>0</Result> 
    <Message>Pending</Message> 
    <PNRef>222131</PNRef> 
    <ExtData>InvNum=123</ExtData> 
</Response> 

我試過幾種方式來獲取值,結果,信息,PNRef,擴展數據,擺脫,我沒有運氣。我總是對的NodePath空值,因此它永遠不會進入循環:

var XmlDoc = new XmlDocument(); 

    XmlDoc.LoadXml(Resources.xmltest); 
    XmlElement NodePath = (XmlElement) XmlDoc.SelectSingleNode("/Response"); 

    while (NodePath != null) 
    { 
    foreach (XmlNode Xml_Node in NodePath) 
    { 
     Console.WriteLine(Xml_Node.Name + " " + Xml_Node.InnerText); 
    } 
    } 

我已經試過這樣:

XmlNode node3 = XmlDoc.SelectSingleNode("PNRef"); 
    Console.WriteLine(node3.Value); 

    Console.WriteLine(XmlDoc.InnerXml); 

    var tst = XmlDoc.GetElementsByTagName("PNRef"); 
    Console.WriteLine(tst); 

這:

NodePath = (XmlElement) XmlDoc.SelectSingleNode("/Response"); 

    if (NodePath != null) 
    { 
    foreach (XmlNode node in NodePath) 
    { 
     Console.WriteLine("NodeName: " + Xml_NodeX.Name); 
     Console.WriteLine("NodeValue: " + node.InnerText); 
    } 
    } 

顯然,我沒有得到XML的讀/寫。我已經用DataSets完成了它,但是他們爲你做了所有的工作。

有人能指出我正確的方向嗎?我一直在這裏比我應該已經。

謝謝!

+0

謝謝大家的快速和偉大的答案! – ErocM 2011-06-06 14:19:58

回答

2

這是因爲節點不叫響應;你需要採取的命名空間考慮:

var XmlDoc = new XmlDocument(); 
var nsmgr = new XmlNamespaceManager(XmlDoc.NameTable); 
nsmgr.AddNamespace("x", "http://DFISofft.com/SmartPayments/"); 
XmlDoc.LoadXml(yourXml); 
XmlElement NodePath = (XmlElement)XmlDoc.SelectSingleNode("/x:Response", nsmgr); 
3

問題是您的XPath查詢沒有指定名稱空間 - 儘管您的文檔在「http://DFISofft.com/SmartPayments/」命名空間中只有一個Response元素。同上PNRef元素。

就個人而言,我會使用LINQ到XML,如果我真的想盡可能使用命名空間。例如:

XNamespace ns = "http://DFISofft.com/SmartPayments/"; 
XDocument doc = XDocument.Load(filename); 

foreach (var element in doc.Descendants(ns + "PNRef")) 
{ 
    // Use element here 
} 

正如你所看到的,LINQ到XML使得它很容易使用的命名空間 - 但當然需要.NET 3.5或更高版本。如果我不得不使用.NET 2.0,我會使用XmlNamespaceManager或手動迭代,並檢查本地名稱而不是使用XPath。

4

你的XML有XML命名空間和你沒有支付任何注意啦:

<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://DFISofft.com/SmartPayments/"> 
      ****************************************** 

從這個XML選擇時,您需要使用XML命名空間!

您沒有考慮文檔上的XML命名空間(xmlns="http://nts-de-osm1-pxc/webservices/")!

試試這個:

var XmlDoc = new XmlDocument(); 

// setup the XML namespace manager 
XmlNamespaceManager mgr = new XmlNamespaceManager(XmlDoc.NameTable); 

// add the relevant namespaces to the XML namespace manager 
mgr.AddNamespace("ns", "http://DFISofft.com/SmartPayments/"); 

XmlDoc.LoadXml(Resources.xmltest); 

// **USE** the XML anemspace in your XPath !! 
XmlElement NodePath = (XmlElement) XmlDoc.SelectSingleNode("/ns:Response"); 

    while (NodePath != null) 
    { 
    foreach (XmlNode Xml_Node in NodePath) 
    { 
     Console.WriteLine(Xml_Node.Name + " " + Xml_Node.InnerText); 
    } 
    } 
0

以供將來參考...

Bubba Soft 本網站已建立的XPath表達式(XPath的生成器)一個偉大的自由工具。

0

這是因爲您正在使用承擔空名稱空間的SelectSingleNode的重載。既然你有一個默認的命名空間,你將需要使用帶有XmlNamespaceManager的版本。See this article for more info.

從文檔:

如果XPath表達式不包括一個前綴,假定命名空間URI是空的命名空間。如果你的XML包含一個默認的命名空間,你仍然必須向XmlNamespaceManager添加一個前綴和命名空間URI;否則,你不會選擇一個節點。有關更多信息,請參閱使用XPath導航選擇節點。