Изменение и символы в XML-файле

#regex #xml #replace

#регулярное выражение #xml #заменить

Вопрос:

В файле XML я хочу заменить символ amp; на amp;#x26; в определенном элементе XML.

Вот структура каталогов и XML-файлов:
OrderImport
—-> 111
—-> 112
—-> 113
—-> 114
—-> 115

В одной папке находятся два XML-файла.

Вызывается один file_drupal.xml , вызывается второй файл fileRDE.xml .

Структура XML-файла file_drupal.xml:

 <?xml version="1.0" encoding="utf-8"?>
<companys>
    <company id="4356722" old_id="972214">
        <producer>text amp; text continues</producer>
        <date>
            <createdDate>2019-06-28T13:09:25 00:00</createdDate>
            <publishingDate>2012-07-13T00:00:00 00:00</publishingDate>
        </date>
        <workflow>published</workflow>
        <text> Laboriosam, fermentum facilis magnam cras pede incididunt placerat rerum urna ut amp; eget justo atque? Distinctio? Ipsa sunt tempore? Necessitatibus saepe 
    duis repudiandae wisi reiciendis
       </text>
    </company>
</companys>
 

amp; Символ должен быть заменен на amp;#x26; в <producer> элементе.

Глобальный в файле file_drupal.xml Я могу сделать это с помощью следующей команды:

 find . -type f -name "file_drupal.xml" -exec ex -sc '%s/amp;/amp;#x26;/g' -cx {} ';'
 

Но я хочу заменить amp; символ в файле file_drupal.xml только в <producer> стихии.

amp; Символ должен быть заменен во всей папке FolderImport, во всех file_drupal.xml файлы в нем.

Как я могу это решить?

Комментарии:

1. В общем случае регулярные выражения являются плохим инструментом для работы со структурированными форматами; но если ввод ограничен, он может работать. В частности, можете ли вы гарантировать, что <producer>....</producer> это всегда происходит все вместе в одной строке в каждом файле?

2. Да, это так

3. Вы назвали это XML-файлом, но это не так. Это было бы менее запутанным для всех, включая вас, если бы вы назвали его файлом, отличным от XML. Дело в том, что существует множество инструментов для работы с файлами XML, но очень мало для работы с файлами, отличными от XML. И другой момент заключается в том, что вам нужно четко понимать в своих отношениях с тем, кто создает эту мерзость, что если они думают, что предоставляют вам XML, они ошибаются.

Ответ №1:

Если </producer> конечный тег всегда встречается в той же строке, <producer> что и начальный тег, попробуйте что-то вроде

 perl -pe 's%(.*<producer>)(.*?)(</producer>.*)%
  $a = $1; $b = $2; $c = $3; $b =~ s|amp;|amp;x26;|g; "$a$b$c"%ge' OrderImport/*/file_drupal.xml
 

-i~ Опция говорит о сохранении оригинала в file_drupal.xml~ качестве резервной копии. Возможно ~ , удалите его, как только вы будете уверены, что это работает правильно.

Демонстрация: https://ideone.com/mohRG5