使用groovy搜索节点在XML中完全匹配

时间:2016-03-18 05:41:50

标签: xml groovy

我正在执行两个xml文件的xml合并。 xmlSrc将合并到xmlDest

代码看起来像

def xmlSrc = new XmlSlurper(false,false).parse(srcFile)
def xmlDest = new XmlSlurper(false,false).parse(destFile)
xmlSrc.children().each{
            if(xmlDest.children().contains(it) == false){
                log "Merging entry ${groovy.xml.XmlUtil.serialize(it)}"
                xmlDest << it
            }else{
                log "not merging: ${groovy.xml.XmlUtil.serialize(it)}"
            }
}

Src XML看起来像:

<?xml version = '1.0' encoding = 'UTF-8'?>
<MetadataDirectory xmlns="http://xmlns.oracle.com/adfm/metainf" version="11.1.1.0.0">
   <BusinessComponentProjectRegistry path="val1"/>
</MetadataDirectory>

Dest看起来像

<?xml version = '1.0' encoding = 'UTF-8'?>
    <MetadataDirectory xmlns="http://xmlns.oracle.com/adfm/metainf" version="11.1.1.0.0">
       <BusinessComponentProjectRegistry path="val2"/>
    </MetadataDirectory>

我希望我的代码在合并时找不到匹配项并插入节点。但是,它总是回归真实。

1 个答案:

答案 0 :(得分:1)

所以你需要比较节点的名称和属性,你不能只比较节点。

xmlSrc.children().each { srcChild ->
    if(xmlDest.children().find { it.name() == srcChild.name() && it.attributes() == srcChild.attributes() }){
        println "not merging: ${XmlUtil.serialize(srcChild)}"
    }
    else {
        println "Merging entry ${XmlUtil.serialize(srcChild)}"
        xmlDest << srcChild
    }
}

请记住,对于这个确切的用例,这是一个非常简单的解决方案。实际上,您的BusinessComponentProjectRegistry个节点可能包含其他节点...您想走多远,看看它们是否相同?例如,在xml中可能存在5个分支的差异

相关问题