Groovy Operators

Control Statements

Groovy File Handling

Groovy Error & Exceptions

Groovy Multithreading

Groovy Synchronization

Groovy - Parsing XML



Groovy has execellent built-in support for parsing and navigating through XML contents. We've multiple ways to perform navigation in XML documents. In this chapter, we're exploring most important and popular one.

  • XmlSlurper is the most popular one. It parses the XML structure into a navigable data structure. We can use dot(.) and array ([]) notations to navigate through elements of XML easily to access elements and attributes.

  • XPath is used for complex queries. Using XPath, we can select nodes based on certain criterias.

Example - Using XmlSlurper for reading, parsing XML

In this example, we're parsing a sample xml text using XmlSlurper and navigating through attributes and elements.

Example.groovy

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)

// get movie properties
println movies.movie[0].type.text() // prints War, Thriller
println movies.movie[1].format.text() // prints DVD

// Access attributes
println movies.movie[0].@title // prints Enemy Behind

// Iterating through elements
movies.movie.each { movie ->
   println "Title: ${movie.@title}, Type: ${movie.type.text()}"
}

// Finding elements by value
def dvdMovies = movies.movie.findAll { it.format.text() == 'DVD' }

// iterate through results
dvdMovies.each { println "DVD based Movie Title: ${it.@title}" }

Output

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

War, Thriller
DVD
Enemy Behind
Title: Enemy Behind, Type: War, Thriller
Title: Transformers, Type: Anime, Science Fiction
DVD based Movie Title: Enemy Behind
DVD based Movie Title: Transformers

Example - Using XPath with XmlSlurper for complex operations

In this example, we're parsing a sample xml text using XmlSlurper and performing complex operations.

Example.groovy

def xmlText = '''
<bookstore>
   <book category="Fiction">
      <title lang="en">Everyday Behind</title>
      <author>Anna De Mas</author>
      <year>2005</year>
      <price>30.00</price>
   </book>
   <book category="WEB">
      <title lang="en">Learning Java</title>
      <author>Erik</author>
      <year>2003</year>
      <price>39.95</price>
   </book>
</bookstore>
'''
// parse xml into books
def books = new XmlSlurper().parseText(xmlText)

// get titles of all books
def titles = books.depthFirst().findAll { it.name() == 'title' }.collect { it.text() }

// prints all titles as a list
println "All Titles: $titles"

// get a book whose price is more than 35.0
def expensiveBooks = books.depthFirst().findAll { it.name() == 'book' && it.price.text().toBigDecimal() > 35.0 }

// print the book
expensiveBooks.each { println "Expensive Book Title: ${it.title.text()}" }     

Output

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

All Titles: [Everyday Behind, Learning Java]
Expensive Book Title: Learning Java
Advertisements