2014-08-28 106 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()第二个参数。