preserve formatting when updating xml file with groovy
I just created gist at: https://gist.github.com/akhikhl/8070808 to demonstrate how such transformation is done with Groovy and JDOM2.
Important notes:
- Groovy technically allows using any java libraries. If somethingcannot be done with Groovy JDK, it can be done with other library.
- jaxen library (implementing XPath) should be included explicitly (via @Grab or via maven/gradle), since it's an optional dependency of JDOM2.
- The sequence of @Grab/@GrabExclude instructions fixes the quirky dependence of jaxen on JDOM-1.0.
- XPathFactory.compile also supports variable binding and filters (see online javadoc).
- XPathExpression (which is returned by compile) supports two major functions - evaluate and evaluateFirst. evaluate always returns a list of all XML-nodes, satisfying the specified predicate, while evaluateFirst returns just the first matching XML-node.
Update
The following code:
new XMLOutputter().with { format = Format.getRawFormat() format.setLineSeparator(LineSeparator.NONE) output(doc, System.out)}
solves a problem with preserving whitespaces and line separators. getRawFormat constructs a format object that preserves whitespaces. LineSeparator.NONE instructs format object, that it should not convert line separators.
The gist mentioned above contains this new code as well.
There is a solution without any 3rd party library.
def xml = file.textdef document = groovy.xml.DOMBuilder.parse(new StringReader(xml))def root = document.documentElementuse(groovy.xml.dom.DOMCategory) { // manipulate the XML here, i.e. root.someElement?.each { it.value = 'new value'}}def result = groovy.xml.dom.DOMUtil.serialize(root)file.withWriter { w -> w.write(result)}