我正在尝试使用 scala 运行 XPath 查询,但它似乎不起作用。 我的 Xml 看起来像(简化):
<application>
<process type="output" size ="23">
<channel offset="0"/>
....
<channel offset="4"/>
</process>
<process type="input" size ="16">
<channel offset="20"/>
....
<channel offset="24"/>
</process>
</application>
我想使用 input
属性检索 process
,为此我使用了这个 XPath 查询:
//process[@type='input']
这应该有效,我用 xpathtester 验证了它 现在,我的 Scala 代码如下所示:
import scala.xml._
val x = XML.loadFile("file.xml")
val process = (x \\ "process[@type='input']") // will return empty NodeSeq() !!!
process
最终为空,它没有捕获我想要的内容。我是这样解决的:
val process = (x \\ "process" filter( _ \"@type" contains Text("input")))
这更丑陋。我的原始查询不起作用的任何已知原因?
最佳答案
不应使用“XPath”来描述 Scala 标准库支持的内容。 XPath 是一种成熟的表达式语言,目前有两个最终版本和第三个版本:
充其量您可以说 Scala 具有非常小的受 XPath 启发的操作子集。因此,您不能期望在不做更多工作的情况下直接将 XPath 表达式粘贴到 Scala。
第三方库可以为实际的 XPath 表达式提供更好的支持,包括:
- Scales Xml
- Scala 库
- “提供了比普通 Scala XML 更像 XPath 的体验,路径看起来像 XPath 并且也像它们一样工作(具有许多相同的功能和轴)”
- 如果我理解得很好,它仍然不是真正的 XPath
- 旨在与 Scala 良好集成
- Saxon
- Java 库
- 开源
- 对 XPath 2(和 XSLT 2)的完整且一致的支持
- 有一个适用于 DOM 和其他数据模型的 XPath API,但目前没有特定的 Scala 支持
关于xml - scala 中的简单 Xpath 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743252/