xml - 使用“管道”字符的 XPath“或”运算符?
问题描述
在 AutoHotKey 例程中,我使用 MSXML6 来解析 XML 文档。
doc := ComObjCreate("MSXML2.DOMDocument.6.0")
doc.setProperty("SelectionLanguage", "XPath")
doc.async := false
doc.loadXML(xmldata)
doc.selectNodes("osm/way|rel[tag[@k='railway'][@v='station']]").length
在SelectNodes
我希望将结果过滤到仅两个节点的行中:way|rel
它不会引发错误,但会忽略rel
仅返回way
节点。
在撒克逊语中使用此语法时有效。MSXML 中是否有解决方案,或者是否有我可以实现的替代解析器?
解决方案
XPath 2.0 需要|
在这样的单个 XPath 中使用。MSXML 仅支持 XPath 1.0。
XPath 1.0
@wp78de 的答案有效(+1),但您可以避免通过使用谓词中的轴来重复tag[@k='railway'][@v='station']
条件:|
self::
osm/*[(self::way or self::rel) and tag[@k='railway'][@v='station']]
XPath 2.0
为了以后可能使用 XPath 2.0 库的读者的利益:
osm/(way|rel)[tag[@k='railway' and @v='station']]
(@wp78de 在意识到 OP 仅限于 XPath 1.0 之前也发布了这个。)
推荐阅读
- php - 找不到类“OSRef”
- r - 从R中数据框中的单元格中提取数字字符
- php - 使用 MySql 数据库无法通过 Android 登录到 PHP?
- angular - 对于大部分相似但地方不同的组件,Angular 的最佳实践是什么?
- docker - golang docker build for linux
- swift - 滚动后 Tableview 部分展开折叠更新
- c# - 将参数传递给正在运行的 C# 应用程序
- android - Android (iOS) 上的 React-Native 本机模块对象渲染
- c# - 在 CIMInstance 中转换参数
- android - Sceneform for ARCore 创建盒子方法