0

我有一个 xml,我想从中选择一个节点,这里是 xml:

  <?xml version="1.0" encoding="utf-8" ?> 
  <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
  <InResponse xmlns="https://ww.ggg.com">
  <InResult>Error </InResult> 
  </InResponse>
  </soap:Body>
  </soap:Envelope>

我正在使用XmlDocument's加载它LoadXML并尝试获取InResult节点,但我得到 null 请参见下文:

xml.SelectSingleNode("//InResult").InnerText;
4

2 回答 2

3

您有一个命名空间声明,您应该将其添加到您的 XPath 中,或者您可以使用与命名空间无关的 XPath。尝试下一个代码作为命名空间不可知的解决方案:

xml.SelectSingleNode("//*[local-name()='InResult']").InnerText;

我收到Error了结果

来自http://www.w3schools.com/网站:

local-name() - 返回当前节点或指定节点集中第一个节点的名称 - 不带命名空间前缀

您可以在此处获得有关 XPath 函数的更多信息。

命名空间感知解决方案,如下所示:

var namespaceManager = new XmlNamespaceManager(x.NameTable);
namespaceManager.AddNamespace("defaultNS", "https://ww.ggg.com");

var result = x.SelectSingleNode("//defaultNS:InResponse", namespaceManager).InnerText;
Console.WriteLine (result); //prints Error

简短的 XML 注释:

根注中的这一部分xmlns:soap="http://www.w3.org/2003/05/soap-envelope"是一个xml 命名空间声明。它用于识别 xml 结构中的节点。通常,您需要指定它们以使用它访问节点,但在 XPath 和 LINQ to XML 中存在与名称空间无关的解决方案。现在,如果您看到节点名称为<soap:Body>,这意味着该节点属于该命名空间。

于 2013-06-03T14:06:05.713 回答
1

这似乎是一个命名空间问题您可以在调用SelectSingleNode()之前使用XmlNamespaceManager

XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("ggg", "https://ww.ggg.com");
xml.SelectSingleNode("//ggg:InResult", ns).InnerText;

注意:未经测试。

于 2013-06-03T14:10:51.270 回答