0

我有以下 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>

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

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

我得到以下结果:

0

当我将xmlns根节点中的属性值更改为空时,如下所示:

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

然后我得到正确的结果:

2

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

4

1 回答 1

0

你为书显示 0 的原因Count是因为书在特定的命名空间下。如果它在具有命名空间的标签之外,那么您的查询将导致 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

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

于 2020-01-21T05:15:46.677 回答