web-dev-qa-db-fra.com

Charger, modifier et écrire un document XML dans Groovy

Je souhaite charger un document XML à partir d'un fichier, modifier quelques éléments spécifiques, puis réécrire sur le disque.

Je ne trouve aucun exemple de la manière de procéder dans Groovy.

18
Mike Sickler

Vous pouvez simplement modifier la propriété value du nœud pour modifier les valeurs des éléments.

/* input:
<root>
  <foo>
    <bar id="test">
      test
    </bar>
    <baz id="test">
      test
    </baz>
  </foo>
</root>
*/

def xmlFile = "/tmp/test.xml"
def xml = new XmlParser().parse(xmlFile)
xml.foo[0].each { 
    it.@id = "test2"
    it.value = "test2"
}
new XmlNodePrinter(new PrintWriter(new FileWriter(xmlFile))).print(xml)

/* output:
<root>
  <foo>
    <bar id="test2">
      test2
    </bar>
    <baz id="test2">
      test2
    </baz>
  </foo>
</root>
*/
38
John Wagenleitner

Si vous voulez utiliser le XmlSlurper :

//Open file
def xml = new XmlSlurper().parse('/tmp/file.xml')

//Edit File e.g. append an element called foo with attribute bar
xml.appendNode {
   foo(bar: "bar value")
}

//Save File
def writer = new FileWriter('/tmp/file.xml')

//Option 1: Write XML all on one line
def builder = new StreamingMarkupBuilder()
writer << builder.bind {
  mkp.yield xml
}

//Option 2: Pretty print XML
XmlUtil.serialize(xml, writer)

Remarque: XmlUtil peut également être utilisé avec XmlParser comme dans l'exemple de @John Wagenleitner.

Références:

4
Heinrich Filter

Il existe un ensemble assez exhaustif d’exemples pour lire/écrire du XML avec Groovy ici . En ce qui concerne le chargement/l'enregistrement des données dans/à partir d'un fichier, les différentes méthodes/propriétés ajoutées par Groovy à Java.io.File devraient fournir les fonctionnalités dont vous avez besoin. Les exemples comprennent:

File.write(text)
File.text
File.withWriter(Closure closure) 

Voir ici pour une liste complète de ces méthodes/propriétés.

1
Dónal

Pour ceux qui trouvent la sortie vide, voici la solution:

def xml = file("${projectDir}/src/main/AndroidManifest.xml")
def manifest = new XmlSlurper().parse(file(xml))
manifest.@package = "com.newapp.id"
xml.withWriter {out->
    XmlUtil.serialize(manifest, out)
}
0
Afrig Aminuddin