如何使用groovy删除仅具有元素XML的特定父(带子)部分

时间:2019-06-14 09:54:58

标签: xml parsing groovy

感谢您花费时间尝试解决此问题, 很难在标题中描述问题,所以我将在这里尝试更具体:)

我无法删除仅具有元素值的父节(包括子节)。

示例: 我有一个XML文件。我使用XMLSlurper循环将其抛出,并存储了解析后的 field 元素。

   <fieldPermissions>
        <editable>false</editable>
        <field>Case.ClosedDate</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.ClosedOnCreate</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.ContactId</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.Description</field>
        <readable>false</readable>
    </fieldPermissions>

所以我将解析的字段存储在这样的地图中:

delList.put(file.name, [
            fields: [Case.ContactId, Case.ClosedDate...], recordTypes: [], objects: []
    ])

我想要的结果结果是: 例如,我想删除Case.ContactId,将其存储在delList映射中,但是我不知道如何删除整个父节以及其中的所有子节,因此最终XML文件应如下所示: / p>

    <fieldPermissions>
        <editable>false</editable>
        <field>Case.ClosedDate</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.ClosedOnCreate</field>
        <readable>false</readable>
    </fieldPermissions>
     //This was Case.ContactId section that i want to delete
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.Description</field>
        <readable>false</readable>
    </fieldPermissions>

2 个答案:

答案 0 :(得分:1)

要删除问题中的节点,您可以执行以下操作:

def xml = '''
<xml>
   <fieldPermissions>
        <editable>false</editable>
        <field>Case.ClosedDate</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.ClosedOnCreate</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.ContactId</field>
        <readable>false</readable>
    </fieldPermissions>
    <fieldPermissions>
        <editable>false</editable>
        <field>Case.Description</field>
        <readable>false</readable>
    </fieldPermissions>
</xml>
'''

import groovy.xml.XmlUtil

def doc = new XmlSlurper().parseText(xml)

doc.fieldPermissions.find { it.field.text() == 'Case.ContactId' }.replaceNode {}

println XmlUtil.serialize(doc)

答案 1 :(得分:1)

所以我们最终找到了一种方法,蒂姆的回答很有帮助,谢谢

delList.each { profileName, value ->
    def profile = xs.parse(new File(profileFolder.path  + "/" + profileName))

if (value.fields.size() > 0) {
    profile.fieldPermissions.each { fieldPermission ->
        if (value.fields.find { it == fieldPermission.field.text() }) {
            fieldPermission.replaceNode {}
        }
    }
}



  //println groovy.xml.XmlUtil.serialize( profile )
}

我们的主要问题是路径...