xmlstarlet does not works

Viewed 84

I would like to ask for some direction, since I tried different approaches, and I was not able to achieve my goal.

My main goal is be able to delete the entire block for the destructiveChanges.xml when some key was found, in this case the current value is "ApexClass", so the entire block must be deleted.

  **<types>
    <name>ApexClass</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>**

This is my code:

**job1:
  stage: test
  before_script:
    - apt-get update;apt-get install -y xmlstarlet
  script:
    - nomDeployedDC=${NONDEPLOYEDDC}
    - echo -e "Test ${nomDeployedDC} "
    - >
      if [ ! -z "$nomDeployedDC" ]; then
          echo "=== Additional cleaning ==="          
          for cleanItem in ${nomDeployedDC}; do
              metadaType=${cleanItem%:*}
              echo -e "Loop ${metadaType} "
              cat destructiveChanges.xml
              echo -ne "Cleaning ${metadaType} "
              xmlstarlet ed --inplace -d '//_:types[_:name="${metadaType}"]' destructiveChanges.xml
              cat destructiveChanges.xml
              echo -e "\rCleaning final ${metadaType} "
          done
          isDeleted="$(grep -c "<types>" destructiveChanges.xml)"
          deleted=${isDeleted%:*}
          echo -e "isDeleted ${deleted} "        
          if [ "$deleted" == 1 ]; then
              echo "=== Deleting destructiveChanges.xml file ===" 
              rm - destructiveChanges.xml
          fi          
      else 
          echo -e "Additional cleaning should be added in the destructiveClean.list file "
      fi**

The output

**

=== Additional cleaning ===
Loop ApexClass 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
    <name>ApexClass</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>
  <types>
    <name>EmailTemplate</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>
  <types>
    <name>CustomObject</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>
</Package>Cleaning ApexClass <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
  <types>
    <name>ApexClass</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>
  <types>
    <name>EmailTemplate</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>
  <types>
    <name>CustomObject</name>
    <members>CC_CaseScenarioMatchingJobQueueable</members>
  </types>
</Package>
Cleaning final ApexClass 
isDeleted 3 
Cleaning up file based variables
00:01
Job succeeded

**

Is there anyone can help me with this? Thank you so much!

1 Answers

To account for namespaces, try changing

xmlstarlet ed --inplace -d '//_:types[_:name="${metadaType}"]' destructiveChanges.xml

to

xmlstarlet ed -L -N x="http://soap.sforce.com/2006/04/metadata"  -d "//x:Package//x:types[x:name[text()='${metadaType}']]"  destructiveChanges.xml

and see if it works.

Related