scala - XML插入/更新

时间:2012-10-15 11:36:54

标签: xml scala xpath insert

你知道根据XPath插入和(或)更新节点的任何Scala API吗?例如,对于给定的Node和XPath,此API将使用新节点

创建XML副本

感谢

3 个答案:

答案 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)

我要做的是使用\\

解析xml

使用.toList.last.text

将xml转换为列表

附加我需要的内容然后收集我的选项:jsonOption collect在这里您可以使用orElse Some再次更改一些选项,然后最终使用for yield来生成我想要的xml。 / p>

利用规模在数据转换方面的灵活性。它不必相同,但我相信你能看到光......

答案 2 :(得分:0)

检查该项目:https://github.com/geirolz/advxml

这是一个基于Cats的简单库,旨在简化XML转换和序列化。