3

例如:

Set objXML = CreateObject("Microsoft.XMLDOM")

objXML.async = False
objXML.validateOnParse = False
objXML.resolveExternals = False
objXML.load("http://www.w3schools.com/dom/books.xml")

'objXML.setProperty "SelectionLanguage", "XPath"

For Each x In objXML.selectNodes("//book[@category='cooking' and @category='children']")
    WScript.Echo x.text
Next

For Each y In objXML.selectNodes("//book[position()<3]")
    WScript.Echo y.text
Next

objXML.setProperty "SelectionLanguage", "XPath"被注释时,第一个 xpath 表达式(x 对象)返回有效,但第二个 xpath 表达式(y 对象)引发错误:

msxml3.dll (14, 1) : Unknown method.

//book[-->position()<--<3]

如果我取消注释objXML.setProperty "SelectionLanguage", "XPath"这两个表达式都有效。

我的问题是何时必须显式设置 XPath 属性,或者在不设置此属性的情况下执行哪种表达式?

4

1 回答 1

4

对于旧版本的 MSXML,默认语言不是 XPath。
您已经使用旧的“与版​​本无关的 ProgID”创建了 DomDocument 实例。Microsoft.XMLDOM对应 MSXML 3.0(如果有)作为支持独立 ProgID 的最后一个 MSXML 版本。
您可以像这样确定默认选择语言:

WScript.Echo objXML.getProperty("SelectionLanguage")

必须返回XSLPattern选择语言不支持的方法,如position().
XPath是 MSXML 4.0 及更高版本的默认选择语言,因此您有两个选择正确使用 XPath。

  1. 使用旧版本将选择语言指定为 XPath。
  2. 使用较新(较旧?)版本而不指定任何选择语言

来自一篇闻起来像我少年时代的古老文章 ,描述了 XSL 模式和 XPath 之间的区别。

MSXML 2.0 提供对XSL 模式的支持,它是XPath 1.0的前身。XML 寻址语言的概念被引入最初的 W3C XSL 工作草案 (http://www.w3.org/TR/1998/WD-xsl-19981216.html) 并称为 XSL 模式。MSXML 2.0 实现了原始 XSL 规范中描述的 XSL 模式语言,但有一些小例外

所以,我认为你是轻微的(!)例外。

于 2012-07-13T01:42:54.373 回答