2013-02-14 31 views
1

我使用xml功能中构建的scala遍历节点,它通常足以满足我的需求。通过名称/位置遍历XML节点而不需要检查边界

但是,如何才能在scala中实现这个简单的单行xpath查询?

//a[2]/b[2]/c[2]/d 

我没有找到一个简单的方法来做到这一点在Scala中, 无需编写代码,以检查至少有2项为每个节点序列。

+0

“哎呀呀” 的重复标记。 – 2013-02-14 16:28:44

回答

2

我会用理解来做到这一点。首先,添加了一些可选指标得到一个元素:

implicit class At[T](val s: Seq[T]) extends AnyVal { 
    def at(n: Int) = (s drop n).headOption 
} 

而现在,

def findIt(n: xml.Node) = for { 
    a2 <- n \\ "a" at 1 // 0-based 
    b2 <- a2 \ "b" at 1 
    c2 <- b2 \ "c" at 1 
} yield c2 \ "d" 

用途:

scala> findIt(<root><a/><a><b/><b><c/><c><d>e</d></c></b></a></root>) 
res16: Option[scala.xml.NodeSeq] = Some(<d>e</d>) 

scala> findIt(<root><a/><a><b/><b><c><d>e</d></c></b></a></root>) 
res17: Option[scala.xml.NodeSeq] = None