Writing updated XML to originally parsed file
Asked Answered
V

1

5

I have a gradle.build where I am trying to:

  1. read an XML file
  2. use XmlSlurper to update an attribute in the read XML file
  3. write the updated XML back to the originally parsed xml file.

The third step only works if I write the modified XML to a new non-existing XML file, but not the originally parsed XML file.

What is the simplest way to write the modified XML to the originally parsed XML file?


My code so far:

def inFile = file('file.xml')
def outFile = file('_file.xml')

def xml = new XmlSlurper().parse(inFile)

// update xml code here

def outBuilder = new StreamingMarkupBuilder()
def outWriter = outFile.newWriter()
XmlUtil.serialize(outBuilder.bind{ mkp.yield xml }, outWriter)

I would like outFile to be file.xml so that it overwrites the original XML file.

Venison answered 22/8, 2013 at 15:40 Comment(0)
A
12

What happens if you do:

def inFile = file( 'file.xml' )
def xml = new XmlSlurper().parse( inFile )

xml.appendNode {
    haha( 'tim_yates' )
}

inFile.withWriter { outWriter ->
    XmlUtil.serialize( new StreamingMarkupBuilder().bind{ mkp.yield xml }, outWriter )
}

Is it just not written? (seems to work for me)

Antoinette answered 22/8, 2013 at 15:43 Comment(3)
Hi @tim_yates, thanks for the quick reply. Your sample code works perfectly and it is a valid answer. My code is still not working however but it must be for another reason altogether (not exactly what that reason is yet but I am basically first exploding a zip and then, I am trying to update an xml file in the exploded archive. In my code I try to get to the xml file via a FileTree as I don't know the exact path to the file ahead of time). Anyway, I'll close this post for now as your answer pretty much answers my initial question! Thanks again, PM.Venison
@Antoinette what does the .bind{ mkp.yield xml } part do?Saire
@ArtB I think it's a shortcut to docs.groovy-lang.org/latest/html/api/groovy/xml/…Harmonia

© 2022 - 2024 — McMap. All rights reserved.