【发布时间】:2014-08-06 21:30:08
【问题描述】:
我有一些 xml,其中在顶层有一个 <id/> 节点,也在后代节点内。有没有办法让我在顶层而不是低层更改值?
示例输入是
val inputXml =
<top>
<id>123</id>
<a>
<id>innerId</id>
</a>
<b>other info</b>
<c>
<id>444</id>
</c>
</top>
我想看到的输出是:
val expectedOutputXml =
<top>
<id>999</id>
<a>
<id>innerId</id>
</a>
<b>other info</b>
<c>
<id>444</id>
</c>
</top>
我尝试过这样使用 RewriteRule:
import scala.xml.transform.{RewriteRule, RuleTransformer}
import scala.xml.{Elem, Node, NodeSeq}
def changeTopId(root:Node, newId:String) = {
val dontChg = root \ "_" filter {e => List("a", "b").contains(e.label)}
object t1 extends RewriteRule{
override def transform(n: Seq[Node]): Seq[Node] = n match {
case e:Elem if dontChg.contains(e) => e
case e:Elem if e.label == "id" => <id>{newId}</id>
case other => other
}
}
object changeTopOne extends RuleTransformer(t1)
changeTopOne(root)
}
但它会影响所有<id/>节点,导致:
scala> changeTopId(inputXml, "999")
res1: scala.xml.Node =
<top>
<id>999</id>
<a>
<id>999</id>
</a>
<b>other info</b>
<c>
<id>999</id>
</c>
</top>
谢谢
【问题讨论】: