Groovy Operators

Control Statements

Groovy File Handling

Groovy Error & Exceptions

Groovy Multithreading

Groovy Synchronization

Groovy - Modifying XML



In Groovy, we can modify an XML content easily. In this chapter, we're doing in using following steps.

  • Load an existing XML document

  • Navigate through XML document using XmlSlurper

  • Modify elements and atttibutes in XML document

  • Serialize the modified document back to string/file

Load and Parse existing XML document

Using XmlSlurper we can load the XML document in the application.

def xmlMovies = '''
<movies>
   <movie title = 'Enemy Behind'> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Transformers'> 
      <type>Anime, Science Fiction</type> 
      <format>DVD</format> 
      <year>1989</year>
      <rating>R</rating> 
      <stars>R</stars> 
      <description>8</description> 
   </movie> 
</movies>
'''

// parse xml into movies object
def movies = new XmlSlurper().parseText(xmlMovies)

Modification to Elements and Attributes

Now navigate through xml structure and modify the elements and the attributes.

// Change the title of the first movie
movies.movie[0].@title = 'GodZilla Plus One'

// Add a new element to the first movie
movies.movie[0].appendNode { edition 'I' }

// Remove an element from second movie
movies.movie[1].year.replaceNode {}

Useful methods

  • replaceNode() − To replace an existing node, we can use replaceNode() within the closure with new node content. It is useful to replace name, attributes or contents of an element.

  • Assign Values Directly − We can assign values directly for simple text based changes.

  • appendNode is used to add a new node to the XML document.

  • @attributeName=value is used to update the value of existing attribute.

  • replaceNode − To replace/remove a node from an XML document, this method is very useful. We can pass empty closure to remove the node or a new node to replace the existing node.

Serialize the updated XML

Once changes are done, we can serialize the XML into a string or file.

import groovy.xml.XmlUtil

def updatedXml = XmlUtil.serialize(movies)
println updatedXml

Complete Example - Modification to XML

Example.groovy

import groovy.xml.XmlUtil

def xmlMovies = '''
<movies>
   <movie title = 'Enemy Behind'> 
      <type>War, Thriller</type> 
      <format>DVD</format> 
      <year>2003</year> 
      <rating>PG</rating> 
      <stars>PG</stars> 
      <description>10</description> 
   </movie> 
   <movie title = 'Transformers'> 
      <type>Anime, Science Fiction</type> 
      <format>DVD</format> 
      <year>1989</year>
      <rating>R</rating> 
      <stars>R</stars> 
      <description>8</description> 
   </movie> 
</movies>
'''
// parse xml into movies object
def movies = new XmlSlurper().parseText(xmlMovies)

// Change the title of the first movie
movies.movie[0].@title = 'GodZilla Plus One'

// Add a new element to the first movie
movies.movie[0].appendNode { edition 'I' }

// Remove an element from second movie
movies.movie[1].year.replaceNode {}

def updatedXml = XmlUtil.serialize(movies)
println updatedXml

Output

When we run the above program, we will get the following result.

<?xml version="1.0" encoding="UTF-8"?><movies>
  <movie title="GodZilla Plus One">
    <type>War, Thriller</type>
    <format>DVD</format>
    <year>2003</year>
    <rating>PG</rating>
    <stars>PG</stars>
    <description>10</description>
    <edition>I</edition>
  </movie>
  <movie title="Transformers">
    <type>Anime, Science Fiction</type>
    <format>DVD</format>
    <rating>R</rating>
    <stars>R</stars>
    <description>8</description>
  </movie>
</movies>
Advertisements