1

私はxml機能に組み込まれたscalaを使用してノードをトラバースしますが、通常はそれで十分です。

しかし、この単純な1行のxpathクエリをscalaでどのように実装できますか?

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

各ノードシーケンスに少なくとも2つの項目があることを確認するコードを記述する必要なしに、scalaでこれを行う簡単な方法を見つけられませんでした。

4

1 に答える 1

2

私はそれを行うために理解のために使用します。まず、任意の 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
于 2013-02-14T16:46:12.413 に答える