2011-12-08 79 views
0

似乎GPathResult返回每次迭代都相同的節點列表。如何在一次迭代中插入節點並在下一次找到它們,如下面的示例所示?如何在GPathResult中插入節點?

def messageNodes = [] as HashSet 
def inputRoot = new XmlSlurper().parse(xmlFile) 
inputRoot.testsuite.list().each { suiteNode -> 
    suiteNode.children().list().each { caseNode -> 
    caseNode.children().list().each { messageNode -> 
     messageNodes << messageNode 
    } 
    } 
} 

inputRoot.testsuite.list().each { suiteNode -> 
    suiteNode.children().list().each { caseNode -> 
    caseNode.children().list().each { messageNode -> 
     assert messageNodes.contains(message) 
    } 
    } 
} 

回答

0

該代碼是不是inserting節點...但是,因爲它代表(試圖找到節點掃描之間的相同),也不會工作,要麼由於道路XmlSlurper作品...

當您在GPathResult上調用children()時,最終會返回一個迭代器,該迭代器將返回NodeChild的新實例。因爲這些都是新的情況下,他們無法相比的,你看到他們的最後一次(因爲他們的哈希碼會有所不同)

如果你改變你的代碼,使用XmlParser像這樣:

def messageNodes = [] 
def inputRoot = new XmlParser().parse(xmlFile) 
inputRoot.testsuite.'*'.'*'.each { messageNode -> 
    messageNodes << messageNode 
} 

inputRoot.testsuite.'*'.'*'.each { messageNode -> 
    println messageNode.hashCode() 
    assert messageNodes.contains(messageNode) 
} 

我相信它正如你所期望的工作(我曾在你的XML格式,雖然猜測,因爲你並沒有告訴我們什麼是問題)

作爲補充,您可以更改線

inputRoot.testsuite.'*'.'*'.each { messageNode -> 
    messageNodes << messageNode 
} 

messageNodes.addAll(inputRoot.testsuite.'*'.'*') 

爲相同的功能...

還應當指出的是,得益於XmlSlurper不存儲內部狀態的通航方式,因此,如果您添加節點,你無法找到他們,除非你把xml寫出來然後再讀回來。如果這是你想要的那種東西,XmlParser也可能是更好的路由