我有一个非常基本的问题,但似乎没有找到优雅的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 :(得分: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