Xpath适用于"MSXML2.DOMDocument"但不适用于"MSXML2.DOMDocument60"

CaB*_*ach 4 xml xpath vba domdocument

可能重复:
XmlDocument中的字符串更大,更少和相等的比较

嗨,在VBA我有以下表达式:

 SourceXml.selectNodes("//Races/Race[/FirstRun[@ActStart>'2011-03-01' or
 @ActEnd<'2011-03-15']]")
Run Code Online (Sandbox Code Playgroud)

如果我将SourceXml定义为MSXML2.DOMDocument,它将检索包含所需节点的列表.如果我将SourceXml定义为MSXML2.DOMDocument60,它将检索一个包含0个元素的列表.

Xpath表达式出了什么问题?

Dim*_*hev 5

您提供的表达式:

//Races/Race[/FirstRun[@ActStart>'2011-03-01' or  ActEnd<'2011-03-15']]
Run Code Online (Sandbox Code Playgroud)

将不选择任何节点,因为在XPath 1.0中不存在><比较操作符串(仅用于数字).上面的两个串首先被转换为数字,其产生NaN并涉及任何比较NaNfalse().因此,谓词的值是false(),表达式不选择任何节点.

使用MSXML2.DOMDocument.SelectNodes()选择节点的事实是因为在MSXML的早期版本中,默认选择语言不是XPath,而是称为"XSL"(如果我记得很清楚),它不是标准的W3C XPath语言.

我想MSXML6不再提供这种过时的方言.

在您的情况下,您可以成功使用此XPath表达式:

//Races/Race[/FirstRun
              [translate(@ActStart,'-','') > 20110301 
             or
               translate(ActEnd, '-','') < 20110315
              ]
            ]
Run Code Online (Sandbox Code Playgroud)

  • 为了完整起见,`MSXML2.DOMDocument`相当于`MSXML2.DOMDocument30` - 请参阅http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right- version-of-msxml-in-internet-explorer.aspx DOMDocument30使用XSLPattern作为默认选择语言(但可以通过SelectionLanguage二级属性将其更改为XPath - 请参阅http://msdn.microsoft.com/en-us /library/ms754679%28v=vs.85%29.aspx) (4认同)