Вы ничего не можете сделать с существующими методами \
или \\
на NodeSeq
. Но вы можете продлить NodeSeq с новым \*
методом (обратите внимание на отсутствие или пробел характера), в соответствии с сутенером-ваша библиотека схеме:
import xml.{NodeSeq, Elem}
class ChildSelectable(ns: NodeSeq) {
def \* = ns flatMap { _ match {
case e:Elem => e.child
case _ => NodeSeq.Empty
} }
}
implicit def nodeSeqIsChildSelectable(xml: NodeSeq) = new ChildSelectable(xml)
В РЕПЛ, это тогда дает мне:
scala> val xml = <a><b><c>xxx</c></b></a>
xml: scala.xml.Elem = <a><b><c>xxx</c></b></a>
scala> xml \*
res7: scala.xml.NodeSeq = NodeSeq(<b><c>xxx</c></b>)
scala> xml \ "b" \*
res8: scala.xml.NodeSeq = NodeSeq(<c>xxx</c>)
scala> xml \ "b" \ "c" \*
res9: scala.xml.NodeSeq = NodeSeq(xxx)
Th лучше, чем принятый ответ. '' _ "' делает именно то, о чем просили, без необходимости писать новый метод. Меньше кода для поддержки, менее нестандартный синтаксис, чтобы запутать следующего парня, который смотрит на ваш код. – rumtscho
Не переоценивайте этот тент. scala-xml сломан. Используйте что-то вроде https://github.com/lihaoyi/scalatags или https://github.com/chris-twiner/scalesXml –