Как удалить весь узел из нескольких файлов 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="&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 не принимает подстановочные знаки или регулярные выражения для соответствия agf__*. Значения fullName, начинающиеся с agf__, многочисленны и различны.

Я надеюсь, что я был достаточно ясен и надеюсь, что кто-то может мне помочь. Спасибо

0 ответов

Другие вопросы по тегам