DOMDocument60中带time属性Cube节点的XPath查询失效
问题根因
旧版MSXML2.DOMDocument(3.0版本)的节点选择逻辑不遵循W3C命名空间规则,而DOMDocument60的XPath实现完全符合标准,二者行为差异是查询结果异常的核心原因。
你解析的ECB汇率XML根节点声明了默认命名空间http://www.ecb.int/vocabulary/2002-08-01/eurofxref,所有Cube节点均归属该命名空间。根据XPath规范,无前缀的节点名仅匹配无命名空间的节点,你使用的//Cube[@time]只会查找不属于任何命名空间的Cube节点,因此返回结果恒为0。
旧版DOMDocument直接按节点名称匹配,忽略命名空间约束,所以相同语句可正常运行。
修复方案
需先给DOMDocument60注册目标节点所属的命名空间前缀,再使用带前缀的XPath查询,具体修改两处:
- 为
xDoc60设置SelectionNamespaces属性,绑定汇率节点对应的命名空间 - 修改XPath语句,使用注册的前缀指定节点
修改后的核心代码:
With xDoc60 .async = False .validateOnParse = False ' 注册命名空间,自定义前缀为ecb .SelectionNamespaces = "xmlns:ecb='http://www.ecb.int/vocabulary/2002-08-01/eurofxref'" .LoadXML (strXML) End With ' 使用带前缀的XPath语句查询 Set xNodeList60 = xDoc60.SelectNodes("//ecb:Cube[@time]")
补充说明
- 若后续需查询
gesmes前缀对应的节点,可在SelectionNamespaces中追加该命名空间的注册规则 - 无需修改旧版
xDoc的相关逻辑,其本身的非标准匹配行为可正常工作
内容的提问来源于stack exchange,提问作者Any1There
相关产品推荐
相关产品推荐

