Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scala中通过映射动态创建xml属性_Scala_Scala Xml - Fatal编程技术网

如何在scala中通过映射动态创建xml属性

如何在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

我有一个包含一些属性的映射,我想创建一个包含这些属性的xml元素

e、 config是scala映射,我想如下所示使用它,但实际上下面的方法不起作用。有人能帮我吗?谢谢

<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"/>