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