使用XPath选择XML节点

本文关键字:节点 XML 选择 XPath 使用 | 更新日期: 2023-09-27 18:16:31

我有一个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>

我正在使用XmlDocumentLoadXML加载它,并试图获得InResult节点,但我得到null,请见下面:

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

使用XPath选择XML节点

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

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

我已经收到Error作为结果

From http://www.w3schools.com/site:

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>,这意味着该节点属于该名称空间。

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

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

注意:未测试。