【问题标题】:Xpath in XML not working because of xml namespace field [duplicate]由于 xml 命名空间字段,XML 中的 Xpath 不起作用 [重复]
【发布时间】:2020-05-07 02:52:09
【问题描述】:

我有以下 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 属性值对我来说至关重要。这个问题有解决办法吗?

【问题讨论】:

  • 这个问题已经被问和回答了 1755 次(搜索“XPath Default Namespace”)。我随意选择了其中一个问题作为重复问题,因为它的支持率最高。

标签: c# xml xpath xml-parsing hl7-v3


【解决方案1】:

您的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

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

【讨论】:

  • 太棒了!!!有效!非常感谢
猜你喜欢
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2014-10-13
  • 2022-07-06
  • 2011-07-24
相关资源
最近更新 更多