-1

Thank's for spending your time on trying to solve this, It's hard to describe the problem in the title, so i will try to be more specific here :)

I'm having trouble deleting parent section (including children) only having the element value.

Example: I have a XML file. I loop threw it using XMLSlurper and store the parsed field element.

   <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>

So I store parsed fields in a map like this in map:

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

The end result that I want is: For instance, I want to delete Case.ContactId, I store it in my delList map, but I don't know how can delete the whole parent section with all the children inside of it so the end XML file should look like this :

    <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>
zugy
  • 33
  • 6

2 Answers2

1

To remove the node in the question, you can just do:

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)
tim_yates
  • 167,322
  • 27
  • 342
  • 338
1

So we found a way in the end, tim's answer helped, thanks

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

Our main issue was, the path....

zugy
  • 33
  • 6
  • Cool... You can replace `if (value.fields.size() > 0)` with `if (value.fields)` ... And `if (value.fields.find { it == fieldPermission.field.text() })` with `if (fieldPermission.field.text() in value.fields)` for maximum Grooviness – tim_yates Jun 14 '19 at 15:28