9
"a"というノードの最初の子Elemを選択します。私が今持っているものは:ノードのすべての子要素をスカラーで選択します。
(xml \ "a")(0).child.collect {case e: Elem => e}
これはかなり冗長です。私は次のようなものを探していました:
xml \ "a" \ "*"
これはスカラーですか?
"a"というノードの最初の子Elemを選択します。私が今持っているものは:ノードのすべての子要素をスカラーで選択します。
(xml \ "a")(0).child.collect {case e: Elem => e}
これはかなり冗長です。私は次のようなものを探していました:
xml \ "a" \ "*"
これはスカラーですか?
の既存の\
または\\
の方法では何もできません。 しかし、あなたはポン引き、あなたのライブラリパターンに従って、新しい\*
方法(注意不足や空白文字)で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)
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)
これは、あなたが探しているものにかなり近いです:
import scala.xml.Elem
val xml = <a><b><c>HI</c></b></a>
println(xml)
println(xml \ "_")
println(xml \ "b")
println(xml \ "b" \ "_")
println(xml \ "b" \ "c")
println(xml \ "b" \ "c" \ "_")
<a><b><c>HI</c></b></a>
<b><c>HI</c></b>
<b><c>HI</c></b>
<c>HI</c>
<c>HI</c>
// Empty
のTh受け入れられた答えよりも優れています。 '' _ ''は、新しいメソッドを書く必要なく、求められたことを正確に行います。管理するコードが少なくて済み、コードを見ている次の人を混乱させる非標準の構文が少なくなります。 – rumtscho
このawnserを過大評価しないでください。 scala-xmlが壊れています。 https://github.com/lihaoyi/scalatagsやhttps://github.com/chris-twiner/scalesXmlのようなものを使用してください –