Scalaで動的なラベルと属性を使用してXMLを構築しますか?

StackOverflow https://stackoverflow.com/questions/1600997

  •  05-07-2019
  •  | 
  •  

質問

これを可能にしたい:

val myXml = <myTag { someAttributes }> </myTag>

(コンパイル時に属性の詳細がわからないため)

そしてこれ:

val myXml = <{someTag}></{someTag}>

これは有効なScala構文ではありません。最も近い方法は、Elemオブジェクトを使用して要素を構築することですが、少し面倒です(PCDATAを望まない場所に挿入する)。上記のような方法はありますか?

役に立ちましたか?

解決

val myXml = <myTag/> % Attribute(None, "name", Text("value"), Null)

さまざまなコンストラクターについては、 scala.xml.Attribute を参照してください。

同じ属性をすべての子に追加する:

scala> val xml = <root><a/><b/><c/></root>
xml: scala.xml.Elem = <root><a></a><b></b><c></c></root>

scala> xml.child map (_ match {
     | case elem : Elem => elem % Attribute(None, "name", Text("value"), Null)
     | case x => x
     | })
res3: Sequence[scala.xml.Node] = ArrayBuffer(<a name="value"></a>, <b name="value"></b>, <c name="value"></c>)

scala.xml.transformの内容を使用して、すべてのXMLに対して再帰的に行うこともできます。

val rr = new RewriteRule {
  override def transform(n: Node): Seq[Node] = n match {
    case elem : Elem => elem % Attribute(None, "name", Text("value"), Null) toSeq
    case other => other
  }
}

val rt = new RuleTransformer(rr)

scala> rt(xml)
res5: scala.xml.Node = <root name="value"><a name="value"></a><b name="value"></b><c name="value"></c></root>

または、xmlの任意の部分に属性を追加できます:

scala> val xml = <root>{<a/> % Attribute(None, "name", Text("value"), Null)}</root>
xml: scala.xml.Elem = <root><a name="value"></a></root>

編集

Scala 2.8では、次のように名前を簡単に変更できます。

val someTag = "tag"
val myXml = <root>{<a/>.copy(label = someTag)}</root>

他のヒント

注:

する必要があります
import scala.xml.Null

これが機能するようにします。 scala.Null も存在します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top