UltraEdit / Notepad - XML ​​Удалить узлы с пустыми свойствами - PullRequest
0 голосов
/ 08 октября 2018

В настоящее время я сталкиваюсь с проблемой с программным обеспечением, с которым я работаю, это программное обеспечение получает от внешнего программного обеспечения несколько Xmls, которые нам нужно обработать, теперь наша проблема заключается в том, что эти Xml-файлы содержат много узлов, которыесовершенно бесполезный, а также делает файлы (xmls) действительно тяжелыми из-за этого, в результате наша программа работает очень медленно для обработки каждого из xmls, это должно быть изменено в будущем, и я хотел бы доказать это, удалив эти узлымы бы значительно улучшили время обработки, теперь я хотел бы в качестве первого шага сделать это вручную, используя образец xml и применяя синтаксис регулярных выражений, чтобы удалить все узлы со значением value пустым, это синтаксис, который я используютеперь и с помощью функции замены в блокноте я могу удалить эти строки, а затем удалить пустые строки:

<.*(\s\w+?[^=]*?="[^"]*?")*?\s+?value="[""]*?".*?>

Пример

<TEST_NODE value="1"/>
<TEST_NODE value=""/>
<TEST_NODE value="0"/>

В моем случае узлы могут называться по-разномуи могут иметь разные свойства, но мне нужно заботиться о тех, которые содержат something в свойстве value, поэтому в этом случае я должен удалить вторую строку

Это выглядит нормально, однако с очень большими файлами (10 Мб) у функции replace notepad ++, похоже, есть проблемы, и она перестает работатьправильно разбивая множество тегов ...

Я пытался использовать другое программное обеспечение под названием "Ultraedit", но синтаксис, я думаю, отличается, так как я могу использовать регулярные выражения, но нужно выбрать один из этих вариантов:Perl, Unix, Ultraedit;только используя «Perl», я могу сделать эту замену, но и там, для больших файлов это не работает, и я получаю следующую ошибку:

Сложность сопоставления выражения превысила доступные ресурсы ..

Кто-нибудь может мне помочь с этим?к сожалению, я не так хорош с Regex, и я не уверен, хорош ли этот код или нет ..

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Попробуйте это:

<(?=[^><]*?value\s*=\s*"")[^><]*>

Заменить ничем.

Это может быть случай катастрофического возврата, когда регулярное выражение выполняется из-за слишком большого количества квантификаторов, примененных к слишком большому количеству классов широких символов, таких как.

Квантификаторы в этом ответе применяются только к не < или > классу, который должен остановить обратное отслеживание выражения через теги XML.

0 голосов
/ 08 октября 2018

Вы используете не тот инструмент для работы.Если вы собираетесь манипулировать XML, вам нужно добавить XSLT и / или XQuery в ваш набор инструментов.Использование регулярных выражений для задания является медленным и подверженным ошибкам.

Например, вот только несколько ошибок в ответе, который вы приняли:

  • Элементы, которые используют одинкавычки (value='') не будут совпадать
  • Элемент с пробелами вокруг знака равенства не будет совпадать
  • Элементы с атрибутом, имя которого заканчивается на value (например, xvalue="") будет сопоставлено
  • value="" будет сопоставлено внутри комментария, а узлы CDATA
  • value="" могут быть сопоставлены внутри текстовых узлов: <x>value=""</x>
  • Элементы разбиты на частинесколько строк не будут совпадать (я подозреваю)

В XSLT 3.0 это просто

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:mode on-no-match="shallow-copy"/>
 <xsl:template match="*[@value='']"/>
</xsl:transform>
0 голосов
/ 08 октября 2018

Попробуйте это регулярное выражение в Блокноте ++

<[^<]+value=""[^>]*>
...