5

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

谢谢

4

2 回答 2

9

您可以使用2.10.3 文档RewriteRule来执行此操作。

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

这两种方法都可以满足您的需求。困难的部分是弄清楚如何获取子节点,然后构建父节点。

于 2014-04-15T19:02:56.600 回答
0

我要做的是使用解析xml\\

使用将 xml 转换为列表.toList.last.text

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

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

于 2012-12-12T16:18:07.620 回答