views:

73

answers:

1

I've parsed some html using XmlSlurper. Now I want to iterate all the children with a given element name.

What I've got now is the following code snippet

html.'**'.findAll { it.name() == 'a' }.each { println it }

It works but just isn't groovy enough. I would like to simply write something like this

html.'**'.a.each { println it }

If I do it this way, GPath complains that there is no property with name 'a'. Any idea if there is an easy syntax to formulate this iteration?

A: 

Unfortunately, there is currently no way in Groovy to perform what you're asking.
When you perform such operation on a GPathResult (or any of its children)

html."**".a.b.c

What is done is that for each "." a call to the GPathResult.getProperty() method is made. And this method as only a few valid syntactic sugar (, *, .. and @). This means that if you don't use one of them, it assume that the property really exist for each node you're targeting.

If you would like to have a conditional null-safe operator for traversing your tree, it would request either the addition of a syntactic sugar prefix (e.g. "?a" ) in the GPathResult class. Maybe that you can achieve that using the expando metaclass and overriding the getProperty method, but I did not try it.

gizmo