如何基于子节点的文本从多个XML文件中删除整个节点?

时间:2019-02-13 13:40:54

标签: ant salesforce xmltask

我在目录中有一组xml文件,作为使用Ant构建过程的一部分,我想根据子节点内的文本删除整个节点。一个例子是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<CustomObject xmlns="http://soap.sforce.com/2006/04/metadata">
  ...
  ...
  <fields>
    <fullName>agf__ADM_Work__c</fullName>
    <deleteConstraint>SetNull</deleteConstraint>
    <deprecated>false</deprecated>
    ...
    ...
  </fields>
  ...
  ...
</CustomObject>

在此示例中,如果其中的文本以agf__开头,我想完全删除所有节点 许多文件中都有许多符合此条件的节点,并且其下的子节点数也有所不同。

我以前使用过ant的'replacedregexp'并匹配了整个模式,过去是所有子模式,其工作方式如下:

<replaceregexp match="&lt;fieldPermissions&gt;\s*&lt;editable&gt;(.+?)&lt;/editable&gt;\s*&lt;field&gt;(.*).agf__(.*)&lt;/field&gt;\s*&lt;readable&gt;(.+?)&lt;/readable&gt;\s*&lt;/fieldPermissions&gt;\s*" replace="" flags="gm" byline="false">
    <fileset dir="${basedir}/src/permissionsets" includes="*.permissionset"/>
</replaceregexp>

这将删除类似的内容:

<fieldPermissions>
    <editable>false</editable>
    <field>something.agf__something</field>
    <readable>true</readable>
</fieldPermissions>

但是当要删除的节点的标记发生更改时,我不确定如何完成此操作。

因此,我尝试使用xmltask,我设法使用像这样的确切字段文本开始工作:

<xmltask todir="${basedir}/src/objects">
        <fileset dir="${basedir}/src/objects" includes="*.object" />
        <remove path="//:CustomObject/:fields[:fullName/text()='agf__ADM_Work__c']"/>
</xmltask>

这有效并删除了第一个示例中'objects'目录中任何文件的节点,该对象以.object结尾 但是我相信xmltask的remove任务不会使用通配符或regexp来匹配agf __ *。以agf__开头的fullName的值很多,并且各不相同。

我希望我足够清楚,希望有人可以帮助我。谢谢

0 个答案:

没有答案