2011-12-08 43 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也可能是更好的路由