我在一个目录中有一组 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="<fieldPermissions>\s*<editable>(.+?)</editable>\s*<field>(.*).agf__(.*)</field>\s*<readable>(.+?)</readable>\s*</fieldPermissions>\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>
这有效并删除了“对象”目录中任何文件的第一个示例中的节点,以 .object 结尾但是我相信 xmltask 的删除任务不会使用通配符或正则表达式来匹配 agf__*。以 agf__ 开头的 fullName 的值很多且各不相同。
我希望我足够清楚,并希望有人可以帮助我。谢谢