使用Scala的XML支持添加XML元素

时间:2015-07-22 11:00:54

标签: xml scala xpath

我有一个非常基本的问题,但似乎没有找到优雅的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树保存回文件?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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 --

问。附加我编程生成的XML标签
A.这将是有用的=&gt; scala - XML insert/update
   这个链接=&gt; 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树保存回文件
答:请使用scala.xml.XML#save