简单的XPath查询斯卡拉(Simple Xpath query in scala)

2019-08-18 14:05发布

我试图运行与一阶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>

我要检索的processinput属性和我使用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")))

这更恶心。 任何已知的原因,我原来的查询不应该工作?

Answer 1:

“的XPath”不应该被用来描述Scala的标准库支持什么。 XPath是一个完整的表达式语言,与迄今为止最后两个版本,并在作品中第三:

  • XPath 1.0中从1999年
  • XPath 2.0中 ,从2007年(2010年第2版)
  • 的XPath 3.0从2013年(候选推荐)

在最好的情况,你可以说,Scala有XPath的启发操作的一个非常小的子集。 所以,你不能指望采取XPath表达式,并直接将其粘贴到斯卡拉没有做更多的工作。

第三方库,可以给你更好的支持实际XPath表达式,其中包括:

  • 秤的Xml
    • Scala库
    • “像提供比正常斯卡拉XML经历一个更为XPath中,路径看起来像的XPath和他们一样工作太(与许多相同的功能和轴)”
    • 它仍然不是实际的XPath,如果我的理解以及
    • 旨在与斯卡拉很好地集成
  • 撒克逊
    • Java库
    • 开源
    • 了用于XPath 2(和XSLT 2)完整的和符合的支持
    • 具有XPath的API,对DOM和其他数据模型的工作原理,但没有具体的斯卡拉支持在这个时候


Answer 2:

要做到这一点的方法之一是使用kantan.xpath :

import kantan.xpath._
import kantan.xpath.implicits._

val input = """
     | <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>
     | """.stripMargin

val inputs = input.evalXPath[List[Node]](xp"//process[@type='input']")

这就产生了一个List[Node] ,但你可以检索与更有趣的类型的值-信道偏移的列表,例如:

input.evalXPath[List[Int]](xp"//process[@type='input']/channel/@offset")
// This yields Success(List(20, 24))


Answer 3:

我相信斯卡拉XML实现是无法处理这么复杂的XPath查询。 然而,它不是很难创建一个小的丰富的包装,以减少混乱,比如看看这个线程 。 随着建议包装可以解决像这样你的问题:

x \\ "process" \@ ("type", _ == "input")


文章来源: Simple Xpath query in scala
标签: xml scala xpath