9

「a」という名前のノードの最初の子要素を選択したいと考えています。私が今持っているものは次のとおりです。

(xml \ "a")(0).child.collect {case e: Elem => e}

これは非常に冗長です。私は次のようなものを探していました:

xml \ "a" \ "*"

これはscalaで可能ですか?

4

2 に答える 2

11

\上の既存のor\\メソッドでは何もできませんNodeSeq。ただし、 pimp -your-library パターンに従って、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)
于 2011-01-07T12:06:07.903 に答える
5

これはあなたが探しているものにかなり近いです:

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
于 2012-08-08T20:17:35.983 に答える