2012-10-15 18 views
5

XPathに従ってノードを挿入したり更新したりするためのScala APIを知っていますか?scala - XMLの挿入/更新

おかげ

+0

Xpathはクエリ言語です。私が知っている限り、それを更新したり書き込んだりすることはできません。あなたはxsltを意味しますか? – Jan

+0

ノードを「選択」するためにXPathが使用され、この「親」ノードに子として追加されるノードを指定します。 btw。 ScalaのXMLは不変ですが、このタスクを達成する方法はありますか? – user1746915

+0

[this](http://stackoverflow.com/questions/4018300/substituting-xml-values-programatically-with-scala)の質問はどうですか?これは、ノードをscala xmlで更新する方法を示しています。 – Jan

答えて

0

は、私はどうなるのか、特定のノードとXPathのために、このAPIは、新しいノードでXMLのコピーを作成することになり、たとえば.toList.last.textを使用してリストにXMLを変換\\

を使用してXMLを解析であります

jsonOption collectここでは、orElse Someを使用していくつかのオプションを再度変更し、最後にfor yieldを使用して、必要なxmlを得ることができます。

データ変換のスケールの柔軟性を活用してください。それは同じである必要はありませんが、私はあなたが光を見ることができると確信しています...

6

これを行うにはRewriteRule2.10.3 documentationを使用できます。

val cats = <Cats> 
    <Cat Name="Floyd"/> 
    <Cat Name="Onyx"/> 
</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>) 

これらのアプロの両方を変更したい

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

同様ならば、次にあなたができる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 
    } 
} 

を想定痛みはあなたが探していることをするでしょう。難しい部分は、子供たちをどうやって得るかを考え出し、親ノードを構築することです。

+0

また、これは:http://stackoverflow.com/a/4019294/1274818 – tysonjh

+0

これは、ここで最高の答えの一つです。私はそれ以上のアップフォースを得られず、正しいとマークされていないとは信じられません。私は見て、他の多くを見たが、これは最も有益だった。ありがとう@tysonjh。 – Philippe