scala - XML插入/更新

use*_*915 5 xml xpath scala insert

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

谢谢

tys*_*njh 8

您可以使用RewriteRule这样做,2.10.3文档.

val cats = <Cats>
  <Cat Name="Floyd"/>
  <Cat Name="Onyx"/>
</Cats>
Run Code Online (Sandbox Code Playgroud)

然后假设 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
   }
 }
Run Code Online (Sandbox Code Playgroud)

然后你可以做到,

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>)
Run Code Online (Sandbox Code Playgroud)

同样,如果您想要更改属性

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>)
Run Code Online (Sandbox Code Playgroud)

这两种方法都可以满足您的需求.困难的部分是弄清楚如何得到孩子,然后建立父节点.


iOS*_*Dev 0

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

使用以下命令将 xml 转换为列表.toList.last.text

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

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