由于 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
(或者您可以使用任何字母/单词)将标签与搜索相关联。当您搜索节点时,使用这个字母和命名空间管理器来获得您需要的结果。
我有以下 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
(或者您可以使用任何字母/单词)将标签与搜索相关联。当您搜索节点时,使用这个字母和命名空间管理器来获得您需要的结果。