你知道根据XPath插入和(或)更新节点的任何Scala API吗?例如,对于给定的Node和XPath,此API将使用新节点
创建XML副本感谢
答案 0 :(得分:8)
您可以使用RewriteRule
执行此操作2.10.3 documentation。
val cats = <Cats>
<Cat Name="Floyd"/>
<Cat Name="Onyx"/>
</Cats>
然后假设RewriteRule
class AddCat(name: String) extends RewriteRule {
override def transform(n: Node): Seq[Node] = n match {
case e: Elem if e.label == "Cats" =>
val cats = (e \\ "Cat")
val newCat = <Cat Name={name}/>
new Elem(e.prefix, "Cats", e.attributes, e.scope, e.minimizeEmpty, (cats ++ newCat).toSeq:_*)
case x => x
}
}
然后你就可以了,
val rule = new RuleTransformer(new AddCat("Stevie"))
rule.transform(cats)
res2: Seq[scala.xml.Node] = List(<Cats><Cat Name="Floyd"/><Cat Name="Onyx"/><Cat Name="Stevie"/></Cats>)
同样,如果您想更改属性
class AddLastName(name: String, lastName: String) extends RewriteRule {
override def transform(n: Node): Seq[Node] = n match {
case e: Elem if e.label == "Cat" && (e \\ "@Name" text).equals(name) =>
val cat: String = e.attributes("Name").head.text
e % Attribute(None, "Name", Text(s"$name $lastName"), Null)
case x => x
}
}
val rule = new RuleTransformer(new AddLastName("Stevie", "Nicks"))
rule.transform(cats)
res3: Seq[scala.xml.Node] = List(<Cats><Cat Name="Floyd"/><Cat Name="Onyx"/><Cat Name="Stevie Nicks"/></Cats>)
这两种方法都可以满足您的需求。困难的部分是弄清楚如何到达孩子,然后建立父节点。
答案 1 :(得分:0)
我要做的是使用\\
使用.toList.last.text
附加我需要的内容然后收集我的选项:jsonOption collect
在这里您可以使用orElse Some
再次更改一些选项,然后最终使用for yield
来生成我想要的xml。 / p>
利用规模在数据转换方面的灵活性。它不必相同,但我相信你能看到光......
答案 2 :(得分:0)
检查该项目:https://github.com/geirolz/advxml
这是一个基于Cats的简单库,旨在简化XML转换和序列化。