使用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>
我正在使用XmlDocument
的LoadXML
加载它,并试图获得InResult
节点,但我得到null,请见下面:
xml.SelectSingleNode("//InResult").InnerText;
您有一个名称空间声明,应该将其添加到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;
注意:未测试。