在Scala中使用动态标签和属性构造XML?

在Scala中使用动态标签和属性构造XML?,xml,scala,Xml,Scala,我希望能够做到这一点: val myXml = <myTag { someAttributes }> </myTag> val myXml= (因为我不知道编译时的属性细节是什么) 这是: val myXml = <{someTag}></{someTag}> val myXml= 这不是有效的Scala语法。我最接近的方法是使用Elem对象来构造元素,但这有点麻烦(在我不希望的地方插入PCDATA)。有没有像上面那样的方法 val myX

我希望能够做到这一点:

val myXml = <myTag { someAttributes }> </myTag>
val myXml=
(因为我不知道编译时的属性细节是什么)

这是:

val myXml = <{someTag}></{someTag}>
val myXml=
这不是有效的Scala语法。我最接近的方法是使用Elem对象来构造元素,但这有点麻烦(在我不希望的地方插入PCDATA)。有没有像上面那样的方法

val myXml = <myTag/> % Attribute(None, "name", Text("value"), Null)
您还可以使用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>
val rr=新的重写规则{
覆盖def转换(n:Node):Seq[Node]=n匹配{
case elem:elem=>elem%属性(无,“名称”,文本(“值”),Null)toSeq
案例其他=>其他
}
}
val rt=新规则转换器(rr)
scala>rt(xml)
res5:scala.xml.Node=
也可以向xml的任意部分添加属性:

scala> val xml = <root>{<a/> % Attribute(None, "name", Text("value"), Null)}</root>
xml: scala.xml.Elem = <root><a name="value"></a></root>
scala>valxml={%Attribute(无,“名称”,文本(“值”),Null)}
xml:scala.xml.Elem=
编辑

在Scala 2.8上更改名称很容易,如下所示:

val someTag = "tag"
val myXml = <root>{<a/>.copy(label = someTag)}</root>
val someTag=“tag”
val myXml={.copy(label=someTag)}
注意:您需要

import scala.xml.Null

为了让它工作,而不是scala.Null,它也存在。

这不允许我用给定的标签创建节点。我看不到创建任意XML结构的方法。Elem的提取器有一个用于儿童的变量。我希望能够传递一个NodeSeq(任意大小)。有没有办法像OP中的第二段那样创建一个节点?@Ittay不知怎的我错过了!顺便说一句,您可以使用:*运算符将NodeSeq作为varargs传入,这将指示编译器逐个传入集合。所以:Elem(诸如此类,诸如此类,(mySeq:*)Attribute()的缺点是它不会保留您正在组成的属性链的顺序。这对计算机来说不是问题,但是如果你不能保证元素的第一个属性是'name'属性,那么对真实的人类来说就不是很清晰了!读了丹尼尔的回复后,我认为“Null”是一个拼写错误,于是改为“Null”。
import scala.xml.Null