VB脚本XML selectNodes在使用名称空间不可知查询时丢失上下文

时间:2015-08-17 14:28:51

标签: xml xpath vbscript namespaces

在VB脚本中使用xpath查询XML文件时," context"使用名称空间无关的查询时,所选节点集的丢失:(请参阅下面的' For ... Next'具体示例)

 Dim Results :Set Results = CreateObject("Microsoft.XMLDOM")
 Results.setProperty "SelectionLanguage", "XPath"
 Results.setProperty "SelectionNamespaces", "xmlns:results='http://example.domain.org/XMLSchema/results-example-3'
 dim defEXdef
 set defEXdef = Results.selectNodes("//*[local-name()='definition']")
 dim def

 'PROBLEM OCCURS IN THIS FOR...NEXT loop
 For Each def in defEXdef
      'HERE: The commented line below works successfully to load the "extended_definitions" elements out from the current "def"
      'dim extended_definitions : set extend_definitions = def.getElementsByTagName("results:extended_definitions")

      'HERE: The line below returns all extended_definitions nodes and ignores the parent's context - as though "def" is now the whole document
      dim extended_definitions : set extended_definitions = def.selectNodes("//*[local-name()='extended_definitions']")
      dim edef
           For Each edef in extended_definitions
                ExDefDict.add edef.text
           Next
 Next

似乎可以通过删除" //"来解决问题。来自selectNodes声明,但为什么会这样? " def'代码中的项目包含的信息多于其选择的原始查询?

我没有示例XML,因为这是一个相当人为的例子(原始文档对于发布过于敏感)。如果需要,我可以尝试生成示例XML。

1 个答案:

答案 0 :(得分:1)

如果您使用//开始路径,则会从文档节点向下搜索,使用def.selectNodes(".//*[local-name()='extended_definitions']")搜索def节点的后代,而不是文档节点的后代。