2013-02-14 3 views
1

Я использую scala, встроенную в xml-функциональность, для перемещения узлов, и этого, как правило, достаточно для моих нужд.Перемещение XML-узлов по имени/положению без необходимости проверки границ

Однако, как реализовать этот простой однострочный запрос xpath в scala?

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

я не нашел простой способ сделать это в Скале, без необходимости написания кода, чтобы проверить, что есть по крайней мере 2 пунктов для каждой последовательности узлов.

+0

"Oops" на дубликате маркировки. – 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 
Смежные вопросы