我想选择名为“a”的节点的第一个子元素。我现在得到的是:
(xml \ "a")(0).child.collect {case e: Elem => e}
这很冗长。我在寻找类似的东西:
xml \ "a" \ "*"
这在 Scala 中可行吗?
最佳答案
您不能对 NodeSeq
上的现有 \
或 \\
方法执行任何操作。
但是您可以使用新的 \*
方法扩展 NodeSeq (注意缺少或空格字符),按照 pimp-your-library 模式:
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)
在 REPL 中,这给了我:
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)
关于xml - 选择scala中节点的所有子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4624797/