添加具有 Scala XML 支持的 XML 元素



我有一个非常基本的问题,但似乎没有找到优雅的Scala方法来解决这个问题。

我想将编程生成的XML标记插入到我使用

从文件中读取的现有XML结构中
xml.XML.loadFile(...)

在我如何创建一个XML根节点在Scala没有文字元素名称?我找到了这个方法来创建我的标签。

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树保存回文件?

谢谢你的帮助!

如何从圣诞集中选择自定义部分?
在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标签
这将是有用的=> scala - XML插入/更新
这个链接=>用scala编程替换xml值

例如,我这样写:
看起来,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 --

。将整个XML树保存回一个文件
A.请使用scala.xml.XML#save

  • 完整源代码:
    【魔杖盒】()

最新更新