gpathresult - Cargar, modificar y escribir un documento XML en Groovy
groovy gpathresult example (4)
Hay un conjunto bastante exhaustivo de ejemplos para leer / escribir XML usando Groovy here . Con respecto a la carga / guardado de los datos en / desde un archivo, los diversos métodos / propiedades que Groovy agrega a java.io.File
, deben proporcionar la funcionalidad que necesita. Ejemplos incluyen:
File.write(text)
File.text
File.withWriter(Closure closure)
Vea here para una lista completa de estos métodos / propiedades.
Tengo un documento XML que quiero cargar desde un archivo, modificar algunos elementos específicos y luego volver a escribir en el disco.
No puedo encontrar ningún ejemplo de cómo hacer esto en Groovy.
Para quien encuentra la salida vacía, aquí está la solución:
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)
}
Si quieres usar el 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)
Nota: XmlUtil
también se puede usar con XmlParser
como se usa en el ejemplo de @John Wagenleitner.
Referencias:
Simplemente puede modificar la propiedad de valor del nodo para modificar los valores de los elementos.
/* 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>
*/