У меня есть набор 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__. Существует много узлов, которые соответствуют этому во многих файлах, и количество дочерних узлов.under меняется.
Я использовал 'replaceregexp' ant ранее и соответствовал всему режиму, всем дочерним элементам в прошлом, и это работает так:
<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>
Это работает и удаляет узел в первом примере для любого из файлов в каталоге 'objects', конец которого находится в .object. Однако я считаю,задача удаления из xmltask не требует подстановочных знаков или регулярных выражений для соответствия agf __ *.Значения fullName, начинающиеся с agf__, многочисленны и различны.
Надеюсь, я был достаточно ясен и надеюсь, что кто-нибудь может мне помочь.Спасибо