C#正在分析Xml SelectingNode

本文关键字:Xml SelectingNode | 更新日期: 2023-09-27 18:19:56

我在C#程序中使用Xml时遇到问题。

xmlhttp://pastebin.com/Ufxaght6(来自沙箱)

我正在尝试获取有关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");

这总是给出一个null。我认为问题来自"getnewsalesrequal"(可能是通配符?)。

来自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/getnewsaleshttp://www.sandbox.priceminister.com/res/schema/getnewsales/getnewsales.2014-02-11.xsd">

知道吗?

提前谢谢。

C#正在分析Xml SelectingNode

您的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()的第二个参数。