2011-06-06 84 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导航选择节点。