Создать XML с динамической меткой и атрибутами в Scala? - PullRequest
25 голосов
/ 21 октября 2009

Я хочу иметь возможность сделать это:

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

(потому что я не знаю, какие данные атрибута находятся во время компиляции)

и это:

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

Это недопустимый синтаксис Scala. Самое близкое, что я могу найти, - это использование объекта Elem для создания элементов, но это немного хлопотно (вставка PCDATA туда, куда я не хочу). Есть ли способ сделать это, как указано выше?

Ответы [ 2 ]

25 голосов
/ 21 октября 2009
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>

EDIT

Изменить имя легко в Scala 2.8, например:

val someTag = "tag"
val myXml = <root>{<a/>.copy(label = someTag)}</root>
10 голосов
/ 19 июля 2010

Примечание: вам нужно

import scala.xml.Null

, чтобы заставить это работать, а не scala.Null, который также существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...