2013-12-26 2 views
0

У меня есть метод:Невозможно создать XML, используя аргументы

def method1(elemName: String, body: Elem) = 
    <someXml> 
    <{elemName}> 
     body 
    </{elemName}> 
    </someXml> 

Он жалуется из-за <{elemName}> и body, где body является XML и elemName является строкой. Это строка, чтобы избежать повторения передачи 2 (открытых и закрывающих) аргументов в xml.

Почему, как это исправить?

ответ

3

Вы должны создать Elem с именем elemName вручную с помощью метода Elem.apply:

import xml._ 

val body = <body /> 
val elemName = "elemName" 

val elem = 
    Elem(prefix = null, 
     label = elemName, 
     attributes = Null, 
     scope = TopScope, 
     minimizeEmpty = true, 
     body) 
<someXml>{elem}</someXml> 
// <someXml>{elem}</someXml> 

С атрибутами:

val attrs = 
    List("k1" -> "v1", "k2" -> "v2").reverse. 
    foldLeft(Null: MetaData){ case (as, (k, v)) => 
     new UnprefixedAttribute(k, v, as) 
    } 

val elem = 
    Elem(prefix = null, 
     label = elemName, 
     attributes = attrs, 
     scope = TopScope, 
     minimizeEmpty = true, 
     body) 
<someXml>{elem}</someXml> 
// <someXml><elemName k1="v1" k2="v2"><body/></elemName></someXml> 

С xmlns:

val elem = 
    Elem(prefix = null, 
     label = elemName, 
     attributes = Null, 
     scope = NamespaceBinding(null, "http://myUrl", TopScope), 
     minimizeEmpty = true, 
     body) 
<someXml>{elem}</someXml> 
// <someXml><elemName xmlns="http://myUrl"><body/></elemName></someXml> 
+0

жалуется. Вы уверены, что это не {Elem (null, elemName, Null, Null, body)}? –

+0

@Alex: работает для меня в REPL '2.9.3' и в' 2.10.1'. – senia

+0

Кроме того, я нашел свое определение, но не могу понять, как передать ему атрибуты. Не могли бы вы помочь мне в этом? –

Смежные вопросы