似乎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 :(得分:0)
该代码不是inserting
个节点......但是就目前而言(尝试查找扫描之间的节点是相同的),由于XmlSlurper
的工作方式,它也无法工作。 ..
当您在children()
上调用GPathResult
时,最终会得到一个返回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
可能也是更好的路线