5

XPathに従ってノードを挿入および(または)更新するScala APIを知っていますか?たとえば、特定のノードと XPath に対して、この API は新しいノードで XML のコピーを作成します。

ありがとう

4

2 に答える 2

9

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

これらのアプローチはどちらも、探していることを実行します。難しいのは、子ノードを取得する方法を見つけてから、親ノードを構築することです。

于 2014-04-15T19:02:56.600 に答える
0

私がすることは、次を使用してxmlを解析することです\\

を使用してxmlをリストに変換します.toList.last.text

必要なものを追加してから、オプションを収集します。jsonOption collectここで、いくつかのオプションを再度使用して変更しorElse Some、最後に a を使用しfor yieldて、必要な xml を取得できます。

データ変換でスケールの柔軟性を活用します。同じである必要はありませんが、光が見えると確信しています...

于 2012-12-12T16:18:07.620 に答える