如何在GPathResult中插入节点?

时间:2011-12-08 20:38:07

标签: groovy

似乎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)
    }
  }
}

1 个答案:

答案 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可能也是更好的路线