【问题标题】:Xpath works on "MSXML2.DOMDocument" but not on "MSXML2.DOMDocument60" [duplicate]Xpath 适用于“MSXML2.DOMDocument”,但不适用于“MSXML2.DOMDocument60”[重复]
【发布时间】:2011-02-01 16:55:26
【问题描述】:

可能重复:
String greater, less, and equal comparison in XmlDocument

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

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

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

Xpath 表达式有什么问题?

【问题讨论】:

  • 首先,您测试一个属性,然后测试一个元素。奇怪...但主要问题是&gt;&lt; 比较运算符仅针对数字定义:来自w3.org/TR/xpath/#booleans 当要比较的对象都不是节点集并且运算符是&lt;=&lt;&gt;=&gt;,然后通过将两个对象都转换为数字并根据 IEEE 754 比较数字来比较对象。这是重复的,但我今天很懒...
  • 好问题,+1。有关问题的解释和建议的解决方案,请参阅我的答案。 :)
  • @Alejandro:谢谢你的信息。

标签: xml vba xpath domdocument


【解决方案1】:

你提供的表达方式

//Races/Race[/FirstRun[@ActStart>'2011-03-01' or  ActEnd<'2011-03-15']]

不会选择任何节点,因为在 XPath 1.0 中没有用于字符串的&gt;&lt; 比较运算符(仅用于数字)。上面的两个字符串首先转换为数字,产生NaN,任何涉及NaN 的比较都是false()。因此,谓词的值为false(),表达式没有选择任何节点。

使用MSXML2.DOMDocument.SelectNodes() 选择节点的事实是因为在这个早期版本的 MSXML 中,默认选择语言不是 XPath,而是一种叫做“XSL”的东西(如果我没记错的话),它不是标准的 W3C XPath 语言。

我猜 MSXML6 不再提供这种过时的方言了。

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多