2010-09-19 36 views
1

我使用XmlSlurper解析了一些html。現在我想用給定的元素名稱迭代所有的孩子。使用XmlSlurper返回的GPathResult遍歷所有具有給定名稱的兒童

我現在已經得到了什麼是下面的代碼片段

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

它的工作原理,但只是沒有足夠的常規。我想簡單地寫這樣的東西

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

如果我這樣做,GPath抱怨沒有名稱爲'a'的屬性。任何想法,如果有一個簡單的語法來制定這個迭代?

回答

3

不幸的是,Groovy目前沒有辦法來執行你所要求的。
當您執行上GPathResult這樣的操作(或任何其子女的)

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

什麼做的是,爲每個「」調用GPathResult.getProperty()方法。而這種方法只有少數有效的語法糖(*,**,..和@)。這意味着如果您不使用其中的一個,則假定該屬性對於您要定向的每個節點確實存在。

如果您想要遍歷樹的條件空安全運算符,它會請求在GPathResult類中添加語法糖前綴(例如「?a」)。也許你可以使用expando元類來實現它,並重寫getProperty方法,但我沒有嘗試它。

1

使用遞歸封閉:

def out = new StringBuffer() 

def printNode 
printNode = { o,node ->   
    o << '<' + node.name() 
    node.attributes().each{ o << ' ' + it.key + '="' + it.value + '"' } 
    o << '>' 
    node.children().each{ printNode(out,it) } 
    o << '</' + node.name() + '>' 
} 

html.'**'.findAll { it.name() == 'a' }.each { printNode(out,it) } 

println out.toString()