使用 xpath 访问具有命名空间的子节点

Posted

技术标签:

【中文标题】使用 xpath 访问具有命名空间的子节点【英文标题】:Access Child nodes with namespace using xpath 【发布时间】:2021-07-09 12:12:00 【问题描述】:

如何使用 Xpath 读取子笔记的内容?

我已经试过了:

var xml = new XmlDocument();
            
xml.Load("server-status.xml");
var ns = new XmlNamespaceManager(xml.NameTable);
ns.AddNamespace("ns", "namespace");
var node = xml.SelectSingleNode("descendant::ns:server[ns:ip-address]", ns)
Console.WriteLine(node.InnerXml)

但我只得到这样的字符串:

<ip-address>127.0.0.50</ip-address><name>Server 1</name><group>DATA</group>

如何单独获取值?

Xml 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<server-status xmlns="namespace">
    <server>
        <ip-address>127.0.0.50</ip-address>
        <name>Server 1</name>
        <group>DATA</group>
    </server>
</server-status>

【问题讨论】:

【参考方案1】:

您在 XPath 中正确使用了 XML 命名空间。

但是,您原来的 XPath,

descendant::ns:server[ns:ip-address]

表示要选择所有带有ns:ip-address 子元素的ns:server 元素。

如果您希望自己选择 ns:ip-address 孩子,请改为使用

descendant::ns:server/ns:ip-address

同样,您可以选择ns:namens:group 元素。

【讨论】:

以上是关于使用 xpath 访问具有命名空间的子节点的主要内容,如果未能解决你的问题,请参考以下文章

为啥命名空间限定节点没有 XPath 语法?

XPath 选择具有命名空间的节点

在 C# 中使用具有默认命名空间的 Xpath

具有命名空间的 XML 文档上的 XPath

如何在具有默认命名空间的 xml 文档上使用 XPath

具有显式默认命名空间的 XML 文档的 XPath 和命名空间规范