私はxml機能に組み込まれたscalaを使用してノードをトラバースしますが、通常はそれで十分です。
しかし、この単純な1行のxpathクエリをscalaでどのように実装できますか?
//a[2]/b[2]/c[2]/d
各ノードシーケンスに少なくとも2つの項目があることを確認するコードを記述する必要なしに、scalaでこれを行う簡単な方法を見つけられませんでした。
私はそれを行うために理解のために使用します。まず、任意の get a element by index に何かを追加します。
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