我试图运行与一阶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>
我要检索的process
与input
属性和我使用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是一个完整的表达式语言,与迄今为止最后两个版本,并在作品中第三:
- 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和其他数据模型的工作原理,但没有具体的斯卡拉支持在这个时候
要做到这一点的方法之一是使用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))
我相信斯卡拉XML实现是无法处理这么复杂的XPath查询。 然而,它不是很难创建一个小的丰富的包装,以减少混乱,比如看看这个线程 。 随着建议包装可以解决像这样你的问题:
x \\ "process" \@ ("type", _ == "input")