【问题标题】:How can I insert nodes in a GPathResult?如何在 GPathResult 中插入节点?
【发布时间】:2011-12-08 20:38:06
【问题描述】:

看起来 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)
    }
  }
}

【问题讨论】:

    标签: groovy


    【解决方案1】:

    该代码不是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 可能也是更好的路线

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 2021-07-02
      • 1970-01-01
      • 2019-08-03
      相关资源
      最近更新 更多