Как удалить весь узел из нескольких файлов XML на основе текста дочернего узла? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть набор 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="&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__, многочисленны и различны.

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

...