Pergunta

Eu quero ser capaz de fazer isso:

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

(porque eu não sei o que os detalhes de atributos são em tempo de compilação)

e este:

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

Esta não é a sintaxe Scala válido. O mais próximo que posso chegar é usar o objeto Elem para construir elementos, mas está sendo um pouco problemático (inserindo PCDATA onde eu não quero que ele). Existe alguma maneira de fazê-lo como o acima?

Foi útil?

Solução

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

Veja scala.xml.Attribute para diferentes construtores.

Adicionando o mesmo atributo para todas as crianças:

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

Você também pode usar o material em scala.xml.transform a fazê-lo de forma recursiva a todos 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>

Ou você pode adicionar atributos a partes arbitrárias do xml:

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

Editar

Mudar o nome é fácil de fazer em Scala 2.8, como este:

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

Outras dicas

Nota: Você precisa

import scala.xml.Null

para chegar a este trabalho, e não scala.Null, que também existe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top