Groovy 如何在GPathResult中插入节点?

Groovy 如何在GPathResult中插入节点?,groovy,Groovy,似乎GPathResult返回的节点列表对于每个迭代都是相同的。如何从一个迭代中插入节点并在下一个迭代中找到它们,如下面的示例所示 def messageNodes = [] as HashSet def inputRoot = new XmlSlurper().parse(xmlFile) inputRoot.testsuite.list().each { suiteNode -> suiteNode.children().list().each { caseNode ->

似乎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)
    }
  }
}
def messageNodes=[]作为HashSet
def inputRoot=new XmlSlurper().parse(xmlFile)
inputRoot.testsuite.list()。每个{suiteNode->
suiteNode.children().list()。每个{caseNode->
caseNode.children().list()。每个{messageNode->
消息节点
suiteNode.children().list()。每个{caseNode->
caseNode.children().list()。每个{messageNode->
断言messageNodes.contains(消息)
}
}
}

该代码不是插入节点,但就目前情况而言(尝试在扫描之间查找节点是相同的),由于
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)
}
对于相同的功能

还应该注意的是,XmlSlurper不以可导航的方式存储内部状态,因此如果添加节点,则除非将xml写出来并读回,否则无法找到它们。如果这是您的目标,那么,
XmlParser
可能也是更好的方法

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