C#Xml值始终为null

时间:2011-06-06 13:48:24

标签: c# xml parsing

我在Resources.xmltest中有以下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,ExtData,并且我没有运气。我总是得到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读/写。我已经使用DataSet进行了操作,但他们为您完成了所有工作。

有人能指出我正确的方向吗?我已经在这里工作的时间比我本来应该的时间长了。

谢谢!

5 个答案:

答案 0 :(得分: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);
    }
  }

答案 1 :(得分:3)

问题是您的XPath查询,它没有指定命名空间 - 尽管您的文档在“http://DFISofft.com/SmartPayments/”命名空间中只有Response元素。同上PNRef元素。

如果我实际想要尽可能使用名称空间,我个人会使用LINQ to XML。例如:

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

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

正如您所看到的,LINQ to XML使得使用命名空间变得非常简单 - 当然它需要.NET 3.5或更高版本。如果我必须使用.NET 2.0,我要么使用XmlNamespaceManager要么手动迭代并检查本地名称而不是使用XPath。

答案 2 :(得分: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 :(得分:0)

供将来参考......

Bubba Soft 该站点有一个很好的免费工具,用于构建XPath表达式(XPath Builder)。

答案 4 :(得分:0)

这是因为您使用假定空名称空间的SelectSingleNode重载。由于您具有默认命名空间,因此您需要使用带有XmlNamespaceManager的版本。 See this article for more info.

来自文档:

  

如果XPath表达式不包含前缀,则假定名称空间URI是空名称空间。如果您的XML包含默认命名空间,您仍必须向XmlNamespaceManager添加前缀和命名空间URI;否则,您将无法选择节点。有关更多信息,请参阅使用XPath导航选择节点。