XPathに従ってノードを挿入および(または)更新するScala APIを知っていますか?たとえば、特定のノードと XPath に対して、この API は新しいノードで XML のコピーを作成します。
ありがとう
RewriteRule
これを行うには、2.10.3 ドキュメントを使用できます。
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>)
これらのアプローチはどちらも、探していることを実行します。難しいのは、子ノードを取得する方法を見つけてから、親ノードを構築することです。
私がすることは、次を使用してxmlを解析することです\\
を使用してxmlをリストに変換します.toList.last.text
必要なものを追加してから、オプションを収集します。jsonOption collect
ここで、いくつかのオプションを再度使用して変更しorElse Some
、最後に a を使用しfor yield
て、必要な xml を取得できます。
データ変換でスケールの柔軟性を活用します。同じである必要はありませんが、光が見えると確信しています...