2015-07-22 5 views
0

У меня есть довольно простой вопрос, но, похоже, не найти элегантный способ Scala для этого.Добавление XML-элемента с поддержкой XML Scala

Я хочу, чтобы вставить теги сгенерированные программно XML в существующую структуру XML, что я прочитал из файла с помощью

xml.XML.loadFile(...) 

В How do I create an XML root node in Scala without a literal element name? я нашел этот подход для создания своих меток.

def textElem(name: String, text: String) = Elem(null, name, Null, TopScope, Text(text)) 

Имея XML дерево

<root> 
    <set start="christmas"> 
    <data> 
     <val>ABC</val> 
     ... 
    </data> 
    <custom> 
     <entry>DEF</entry> 

     <!-- APPEND HERE --> 

    </custom> 
    </set> 
    <set start="halloween"> 
    ... 
    </set> 
</root> 

Как выбрать пользовательский раздел из набора Рождество, добавить свои теги, генерируемые программно XML и сохранить весь XML-дерево обратно в файл?

Благодарим за помощь!

ответ

0

В. Как выбрать пользовательский раздел из рождественского набора?
А. В Scala, мы можем использовать def \\(that: String): NodeSeq

val custom = christmas \\ "custom" 
println("-- print custom element --") 
println(custom) 
println("-- end --") 

выход:

-- print custom element -- 
<custom> 
    <entry>DEF</entry> 
    <!-- APPEND HERE --> 
</custom> 
-- end -- 

Q. добавить мои сгенерированные XML программно-теги
A. Было бы полезно =>scala - XML insert/update
И эта ссылка =>substituting xml values programatically with scala

Например, я написал вот так:
Похоже, что метод transform упростит управление XML-документами.

 // Q. Append my programatically generated XML tags 
     // A. Use RewriteRule#transform 
     val rule = new AppendRule 
     val appended = rule.transform(christmas) 
     println("-- print custom element --") 
     println(pp.format(appended(0))) 
     println("-- end --") 
    } 
} 

class AppendRule extends RewriteRule { 
    override def transform(n: Node): Seq[Node] = n match { 
     case <entry>{v}</entry> 
      => println(s"Find value in tag <entry> => $v") 
       <entry>ABC</entry> 
       <entry>{v}</entry> 
     case elem: Elem 
      => elem copy (child = elem.child flatMap (this transform)) 
     case other 
      => other 
    } 
} 

выход:

Find value in tag <entry> => DEF 
-- print custom element -- 
<root> 
    <set start="christmas"> 
    <data> 
     <val>ABC</val> 
    </data> 
    <custom> 
     <entry>ABC</entry> 
     <entry>DEF</entry> 
     <!-- APPEND HERE --> 
    </custom> 
    </set> 
    <set start="halloween"> </set> 
</root> 
-- end -- 

Q. сохранить весь XML-дерево обратно в файл
A. Используйте scala.xml.XML#save

+0

Спасибо, много помогли - извините за поздний ответ! –

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