[SalesForce] Deploying destructiveChanges.xml – Error parsing package.xml

Wondering if someone can help me with this. I'm trying to delete some components with the migration tool (Ant).

However when I try to deploy, I'm getting the following error:

    *********** DEPLOYMENT FAILED ***********
Request ID: 0Af2400000stDKJCA2

All Component Failures:
1.  package.xml -- Error: Bad file:Unexpected element {http://soap.sforce.com/2006/04/metadata}members during simple type deserialization

*********** DEPLOYMENT FAILED ***********


Total time: 2 seconds

Here is package.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <fullName>codepkg</fullName>
    <version>35.0</version>
</Package>

This is the sample package.xml for undeploying code that comes bundled with the Migration Tool.

Here is destructiveChanges.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>MyClass</members>
        <name>ApexClass</name>
    </types>
    <version>33.0</version>
</Package>

Both files are in the same directory.

I also get the same error message when deploying the same files with the Dev. Workbench:

workbench error

Now if I remove this line from package.xml:

<fullName>codepkg</fullName>

I still get the same error.

Can anyone shed some light on what I'm doing wrong here?

Best Answer

Sorry if you find this overKill (This will retrieve all items from your org and remove them)

The way i have gotten mine to work (This is for a full dev operation and will be overkill if you know all the information needed, However if you do not know all of the data by name this will work. It will just take some time to run) is with a several stage deploy undeploy check, First i generate a package.xml for all items within a org. using the wildcard *

Here is what mine looks like (CUT DOWN VERSION) (Package.xml)

<echo file="purge/package.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
            <Package xmlns="http://soap.sforce.com/2006/04/metadata">
            <types><members>*</members><name>ApexClass</name></types>
            <types><members>*</members><name>ApexPage</name></types>
            <types><members>Opportunity.BatchProcess__c</members><name>CustomField</name></types>
            <types><members>*</members><name>CustomField</name></types>
            <types><members>*</members><name>CustomLabel</name></types>
            <types><members>*</members><name>CustomLabels</name></types>
            <types><members>*</members><name>CustomObject</name></types>
            <version>34.0</version>
            </Package>
        ]]></echo>

then you will want to replace the package definition like so

 <replace file="purge/package.xml">
        <replacetoken><![CDATA[</version>]]></replacetoken>
        <replacevalue><![CDATA[</version><fullName>Purge</fullName>]]></replacevalue>
    </replace>

Now you will want to re-deploy the wildcard package definition

<sf:deploy
        username="${sf.username}"
        password="${sf.password}"
        serverurl="https://login.salesforce.com"
        deployRoot="purge"
        purgeOnDelete="true"
        pollWaitMillis="1000" />

Next you will want to retrieve by name (This will give you your explicit package definition, You can skip all the above if you have this information already)

    <sf:retrieve
    username="${sf.username}"
    password="${sf.password}"
    serverurl="https://login.salesforce.com"
    retrieveTarget="purge"
    packageNames="Purge"
    pollWaitMillis="1000" />

You can trash all local components retrieved from this.

<delete includeEmptyDirs="true" dir="purge" includes="**/*" excludes="*.xml" />
        <copy file="purge/package.xml" tofile="purge/destructiveChanges.xml" />
        <echo file="purge/package.xml"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
            <Package xmlns="http://soap.sforce.com/2006/04/metadata">
            <version>29.0</version>
            </Package>
        ]]></echo>

Now you can deploy your explicate deploy over the top of the org. This will delete everything.

    <sf:deploy
    username="${sf.username}"
    password="${sf.password}"
    serverurl="https://login.salesforce.com"
    deployRoot="purge"
    purgeOnDelete="true"
    pollWaitMillis="10000" />

The above will get you removing all items from the org, You can write in ignore rules if you wish.

To me you above error of members is referencing your Package.XML where you have not told it about any Members Or Types. I would add

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

just to rule that out. But this will get you running.