Frage

Ich möchte in der Lage sein, dies zu tun:

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

(weil ich nicht weiß, was das Attribut Details bei der Kompilierung sind)

und folgt aus:

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

Dies ist nicht gültig Scala Syntax. Die nächstgelegene ich kommen kann, ist das Elem Objekt unter Verwendung von Elementen zu konstruieren, aber es ist ein wenig lästig (Einfügen PCDATA, wo ich will es nicht zu). Gibt es eine Möglichkeit, es wie die oben zu tun?

War es hilfreich?

Lösung

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

Siehe scala.xml.Attribute für verschiedene Konstrukteure.

Hinzufügen das gleiche Attribut für alle Kinder:

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>)

Sie können auch die Sachen in scala.xml.transform verwenden, so rekursiv auf alle XML zu tun:

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>

Sie können auch Attribute auf beliebige Teile des XML hinzu:

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

Bearbeiten

die Namen zu ändern, ist leicht auf Scala 2.8, wie dies zu tun:

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

Andere Tipps

Hinweis: Sie müssen

import scala.xml.Null

bekommen dies funktioniert, und nicht scala.Null, das existiert auch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top