如何在scala中通过映射动态创建xml属性
我有一个包含一些属性的映射,我想创建一个包含这些属性的xml元素 e、 config是scala映射,我想如下所示使用它,但实际上下面的方法不起作用。有人能帮我吗?谢谢如何在scala中通过映射动态创建xml属性,scala,scala-xml,Scala,Scala Xml,我有一个包含一些属性的映射,我想创建一个包含这些属性的xml元素 e、 config是scala映射,我想如下所示使用它,但实际上下面的方法不起作用。有人能帮我吗?谢谢 <input type="text" {config.map(entry => entry._1 + "=" + entry._2)}></input> entry.\u 1+“=”+entry.\u 2)}> 使用低级API。这是scalac解析器在对xml文本进行解压缩时生成的内容: impo
<input type="text" {config.map(entry => entry._1 + "=" + entry._2)}></input>
entry.\u 1+“=”+entry.\u 2)}>
使用低级API。这是scalac解析器在对xml文本进行解压缩时生成的内容:
import scala.xml.{UnprefixedAttribute, MetaData, TopScope, Text, Elem, Null}
val config: Map[String, String] = Map("k1" -> "v2", "k2" -> "v2")
val seed: MetaData = Null // Don't ask.
val meta: MetaData = config.toList.foldLeft(seed) {
case (acc, (s1, s2)) =>
new UnprefixedAttribute(
key = s1,
value = s2,
next = acc
)
}
Elem(
prefix = null,
label = "input",
attributes = meta,
scope = TopScope,
minimizeEmpty = false
)
真倒霉,你不能写你想要的东西。我猜Scala编译器的XML文本解析器不够复杂,无法解析在任何地方插入表达式的XML文本。它们只能位于标记之间或作为单个属性值 作为一种解决方法,可以创建没有属性的元素,或者只创建一个属性而缺少其余属性:
val elem = <input type="text"/>
上面对元素使用复制构造函数,然后对属性使用复制构造函数
还可以选择仅使用一个副本构造函数,并以稍微不同的方式折叠:
elem.copy(attributes = config.foldRight(elem.attributes) {
case ((k, v), next) => scala.xml.Attribute(k, scala.xml.Text(v), next)
})
res2: scala.xml.Elem = <input k1="v2" k2="v2" type="text"/>
这避免了必须生成文本
元素,以便为属性
提供一个NodeSeq
值。这是一件麻烦事。也许Scala可以解析输入
元素,然后您可以附加属性?这样的代码可能更简单。事实上,您的解决方案更简洁:)。我想在这里指出的一点是,可以理解scala.xml API并直接使用它们。尽管有一些奇怪的玉米,但它们非常简单,而且有很好的记录。是的,这是真的。看了一会儿,我想它并不像我一开始想象的那么复杂。
elem.copy(attributes = config.foldRight(elem.attributes) {
case ((k, v), next) => scala.xml.Attribute(k, scala.xml.Text(v), next)
})
res2: scala.xml.Elem = <input k1="v2" k2="v2" type="text"/>
elem.copy(attributes = config.foldRight(elem.attributes) {
case ((k, v), next) => new scala.xml.UnprefixedAttribute(k, v, next)
})
res3: scala.xml.Elem = <input k1="v2" k2="v2" type="text"/>