由于 xml 命名空间字段,XML 中的 Xpath 无法正常工作

Xpath in XML not working because of xml namespace field

我有以下 XML:

<?xml version="1.0" encoding="UTF-8" ?>
<bookstore xmlns="urn:hl7-org:v3" xmlns:voc="urn:hl7-org:v3/voc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 PORT_MT020001.xsd" type="Observation" classCode="OBS" moodCode="EVN">
    <book>
        <title lang="en">Harry Potter</title>
        <price>29.99</price>
    </book>

    <book>
        <title lang="en">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>

当我尝试像这样在上面 xml 上使用 XMLDocument.SelectNodes() 时:

XmlNodeList xmlNodelist = doc.SelectNodes("//book");
Console.WriteLine(xmlNodelist.Count);

我得到的结果是:

0

当我像这样将根节点中的 xmlns 属性值更改为空时:

<bookstore xmlns="" ...........>

然后我得到正确的结果:

2

为什么会这样?根节点中的 xmlns 属性值对我来说至关重要。这个问题有什么解决办法吗?

您的 Count 书籍显示为 0 的原因是书籍属于特定的命名空间。如果它在具有命名空间的标签之外,那么您的查询结果将是 2。

要使您的查询适用于属于命名空间的标签(具有命名空间的父标签意味着所有子标签都继承该命名空间),您可以使用这样的代码,

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
    nsmgr.AddNamespace("x", doc.DocumentElement.NamespaceURI);

    XmlNodeList xmlNodelist = doc.DocumentElement.SelectNodes("//x:book", nsmgr);
    Console.WriteLine(xmlNodelist.Count); // Prints 2

这是用文档的默认 namespaceUri 创建一个 NamespaceManager,并使用 x(或者您可以使用任何字母/单词)将标签与搜索相关联。当您搜索节点时,使用这个字母和命名空间管理器来获得您需要的结果。