关于为什么- 至少在 .Net 框架中 - 在执行 XPath 查询时有XmlNamespaceManager
必要[local-name()=...
使用. 我确实理解为什么命名空间是必要的或至少是有益的,但为什么它如此复杂?
为了查询一个简单的 XML 文档(无命名空间)...
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode>
<nodeName>Some Text Here</nodeName>
</rootNode>
...一个人可以使用类似的东西doc.SelectSingleNode("//nodeName")
(匹配<nodeName>Some Text Here</nodeName>
)
谜团#1:我的第一个烦恼——如果我理解正确的话——仅仅是将命名空间引用添加到父/根标记(无论是否用作子节点标记的一部分),如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns="http://example.com/xmlns/foo">
<nodeName>Some Text Here</nodeName>
</rootNode>
...需要几行额外的代码才能获得相同的结果:
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("ab", "http://example.com/xmlns/foo")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//ab:nodeName", nsmgr)
...基本上梦想着一个不存在的前缀(“ ab
”)来找到一个甚至不使用前缀的节点。这有什么意义?(概念上)有什么问题doc.SelectSingleNode("//nodeName")
?
谜团 #2:假设您有一个使用前缀的 XML 文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<rootNode xmlns:cde="http://example.com/xmlns/foo" xmlns:feg="http://example.com/xmlns/bar">
<cde:nodeName>Some Text Here</cde:nodeName>
<feg:nodeName>Some Other Value</feg:nodeName>
<feg:otherName>Yet Another Value</feg:otherName>
</rootNode>
...如果我理解正确,您必须将两个命名空间都添加到XmlNamespaceManager
, 以便查询单个节点...
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
nsmgr.AddNamespace("cde", "http://example.com/xmlns/foo")
nsmgr.AddNamespace("feg", "http://example.com/xmlns/bar")
Dim desiredNode As XmlNode = doc.SelectSingleNode("//feg:nodeName", nsmgr)
...为什么,在这种情况下,我需要(概念上)一个命名空间管理器?
******已编辑为以下评论****
编辑添加: 我修改和完善的问题是基于 XmlNamespaceManager 在我认为大多数情况下的明显冗余以及使用命名空间管理器来指定前缀到 URI 的映射:
当名称空间前缀(“cde”)到名称空间 URI(“ http://example.com/xmlns/foo ”)的直接映射在源文档中明确说明时:
...<rootNode xmlns:cde="http://example.com/xmlns/foo"...
程序员在进行查询之前重新创建该映射的概念需求是什么?