Search code examples
xmlgroovyxmlslurper

Parent node in Groovy XmlSlurper


I am using Groovy / XmlSlurper to read parent nodes of an XML document, for example the following program:

import groovy.xml.*

def text = '''
    <list>
        <books>
            <book available="20" id="1">
                <title>Don Quixote</title>
                <author>Miguel de Cervantes</author>
            </book>
            <book available="14" id="2">
                <title>Catcher in the Rye</title>
                <author>JD Salinger</author>
            </book>
        </books>
    </list>
'''

def xml  = new XmlSlurper().parseText(text) 
def book = xml.books.book

println "1.) Name book                            = " + book.name()
println "2.) Name book.parent()                   = " + book.parent().name()
println "3.) Name book.parent().parent()          = " + book.parent().parent().name()
println "4.) Name book.parent().parent().parent() = " + book.parent().parent().parent().name()

I expect the output to be:

1.) Name book                            = book
2.) Name book.parent()                   = books
3.) Name book.parent().parent()          = list
4.) Name book.parent().parent().parent() = Null

However, I get a different, strange result (in particular, I expect line 4 to be Null/empty, but it seems that I am running in circles...):

1.) Name book                            = book
2.) Name book.parent()                   = books
3.) Name book.parent().parent()          = book
4.) Name book.parent().parent().parent() = books

Where is my mistake ?

Thanks in advance for your help


Solution

  • adding book[0].parent() will do the trick

    println "1.) Name book                            = " + book[0].name()
    println "2.) Name book.parent()                   = " + book[0].parent().name()
    println "3.) Name book.parent().parent()          = " + book[0].parent().parent().name()
    println "4.) Name book.parent().parent().parent() = " + book[0].parent().parent().parent().name()
    

    the reason - xml.books.book returns you a list of book


    IMHO: i prefer to use XmlParser instead of XmlSlurper - it's more stricted and will give you quite clear error for your original code.