Облом вы не можете написать то, что вы хотели. Я предполагаю, что синтаксический анализатор литералов XML компилятора Scala недостаточно сложен, чтобы анализировать литералы XML с выражениями, только что вставленными где угодно. Они могут быть только между тегами или как значения отдельных атрибутов.
В качестве обходного пути можно создать элемент без атрибутов или только с одним атрибутом, а остальные отсутствуют:
val elem = <input type="text"/>
Затем вы можете добавить атрибуты из вашего Map
с помощью пары конструкторов копирования.
elem.copy(
attributes = elem.attributes.copy(
config.foldLeft(scala.xml.Null: scala.xml.MetaData) {
case (next, (k, v)) => scala.xml.Attribute(k, scala.xml.Text(v), next)
}
))
res1: scala.xml.Elem = <input type="text" k2="v2" k1="v2"/>
В приведенном выше примере используется конструктор копирования для Elem
, а затем один для attributes
.
Также есть возможность просто использовать один конструктор копирования и свернуть немного по-другому:
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"/>
Это может быть самый простой вариант.
Хотя решение Оливье показывает, что UnprefixedAttributed
примет String
в качестве значения атрибута.
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"/>
Это позволяет избежать необходимости создавать элемент Text
, чтобы вы предоставили значение NodeSeq
для Attribute
.
person
ashawley
schedule
04.05.2017