Удаление всего, что находится между тегами XML и их содержимым

Мне нужно было бы удалить что-либо между тегами XML, особенно пробелы и символы новой строки.

Например, удаление пробелов и новостных лент из:
‹/node› \n‹node id="whatever"›

чтобы получить:
‹/node›‹node id="что угодно"›

Это не предназначено для синтаксического анализа XML вручную, а скорее для подготовки данных XML перед их синтаксическим анализом с помощью инструмента. Чтобы быть более конкретным, я использую Hpricot (Ruby) для разбора XML, и, к сожалению, в настоящее время мы застряли на версии 0.6.164, так что... я не знаю о более поздних версиях, но эта часто возвращает странные узлы. (Объекты), содержащие только пробелы и разрывы строк. Итак, идея состоит в том, чтобы очистить XML перед преобразованием его в документ Hpricot. Приветствуются альтернативные решения.

Пример из теста: NoMethodError: undefined method `children' for "\n":Hpricot::Text
Интересная часть здесь не в NoMethodError, потому что это нормально, а в том, что элемент Hpricot::Text содержит только перевод строки и ничего больше.


person rubiii    schedule 20.07.2009    source источник


Ответы (5)


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

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

person Jon Skeet    schedule 20.07.2009

Решение состоит в том, чтобы выбрать все «пустые» текстовые узлы и удалить их.

doc = Nokogiri(xml_source)
doc.xpath('//text()[not(normalize-space())]').remove
person mislav    schedule 06.10.2009

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

Тем не менее, что-то вроде:

s/>.*?</></gs

(это синтаксис Perl) может делать то, что вы хотите. Это говорит о том, что нужно взять все, что больше, чем меньше, и убрать это. Буква «g» в конце говорит о том, что нужно выполнить замену столько раз, сколько необходимо, а «s» делает «.» соответствовать всем символам, ВКЛЮЧАЯ новые строки (иначе новые строки не будут включены, поэтому шаблон нужно будет запускать один раз для каждой строки, и он не будет охватывать теги, охватывающие несколько строк).

person Adam Batkin    schedule 20.07.2009

Вы не должны использовать регулярное выражение для анализа XML или HTML, это просто ненадежно, и есть слишком слишком много пограничных случаев. Вместо этого вы должны использовать синтаксический анализатор XML/HTML для такого рода вещей.

person TJ L    schedule 20.07.2009

Не используйте регулярное выражение. Попробуйте разобрать XML в DOM и манипулировать оттуда (какой язык/фреймворк вы используете?);

person Janie    schedule 20.07.2009