我对 为什么没什么研究,至少在。Net Framework ——在执行 XPath 查询时,需要使用 XmlNamespaceManager
来处理名称空间(或者相当笨重和冗长的 [local-name()=...
XPath 谓词/函数/其他)。我理解为什么名称空间是必要的或者至少是有益的,但是 为什么是否如此复杂?
为了查询一个简单的 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"...
程序员在进行查询之前重新创建映射的概念需求是什么?