2017-01-22 6 views
2

Ich möchte zur Laufzeit ein beliebiges Element in XML auswählen und seinen Wert aktualisieren. Zum BeispielScala - Wert eines beliebigen XML-Elements ändern

xml wie gegeben
<root> 
    <abc>123</abc> 
    <def>456</def> 
</root> 

ich entweder <abc> oder <def> zur Laufzeit willkürlich wählen will (nicht fest einprogrammiert) und dessen Wert zu aktualisieren. Ich fand viele Fragen in verwandten Links, aber alle Lösung harten Code Label-Namen im Voraus.

habe ich versucht, Funktion, die Elementnamen und neuen Wert als params wie

object RuleFactory { 

    // This function should not hard code literals "abc" or "def" 
    def createRuleTransformer(name:String, value : String) : RuleTransformer = { 
    new RuleTransformer(new RewriteRule { 
     override def transform(n: Node): Seq[Node] = n match { 
     case elem @ Elem(prefix, label, attribs, scope, _) if elem.label.equalsIgnoreCase(name) => Elem(prefix, label, attribs, scope, false, Text(value)) 
     case other => other 
     } 
    }) 
    } 

} 

und

object RuleFactory { 
    def createRuleTransformer(name:String, value : String) : RuleTransformer = { 
    new RuleTransformer(new RewriteRule { 
     override def transform(n: Node): Seq[Node] = n match { 
     case elem : Elem if elem.label.equalsIgnoreCase(name) => elem copy (child = Text(value) flatMap (this transform)) 
     case other => other 
     } 
    }) 
    } 
} 

jedoch beide nicht gedruckt aktualisiert xml nimmt, wenn ich wie

val trasnformer = RuleFactory.createRuleTransformer("def", "2") // These params will be random 
println(trasnformer(InputXml)) 
Transformation durchführen

Ist dies mit RewriteRule möglich?

+0

Ja, RewriteRule ist der Weg, dies zu tun. – marios

+0

Können Sie mir zeigen, wie Sie dies mit RewriteRule erreichen? – Hiren

Antwort

0

Von https://github.com/scala/scala-xml/issues/129

Es stellt sich heraus unglückliche Namen Kollision zu sein, weil der lexikalischen Scoping-Regeln des Scala. Es ist eine Folge dieser Klasse Mitglied:

http://www.scala-lang.org/api/current/scala-xml/scala/xml/transform/RewriteRule.html#name:String

https://github.com/scala/scala-xml/blob/4c09977/src/main/scala/scala/xml/transform/RewriteRule.scala#L23

ändern Variablennamen das Problem lösen. Hier ist der aktualisierte Code.

object RuleFactory { 

    def createRuleTransformer(key:String, value : String) : RuleTransformer = { 
    new RuleTransformer(new RewriteRule { 
     override def transform(n: Node): Seq[Node] = n match { 
     case elem @ Elem(prefix, label, attribs, scope, _) if elem.label.equalsIgnoreCase(key) => 
      Elem(prefix, label, attribs, scope, false, Text(value)) 
     case other => other 
     } 
    }) 
    } 

} 
Verwandte Themen