Как удалить весь узел из нескольких файлов XML на основе текста дочернего узла?
У меня есть набор 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__. Есть много узлов, которые соответствуют этому во многих файлах, и число дочерних узлов варьируется.
Я использовал "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__, многочисленны и различны.
Я надеюсь, что я был достаточно ясен и надеюсь, что кто-то может мне помочь. Спасибо