Удаление чего-либо между тегами XML и их содержимым - PullRequest
2 голосов
/ 20 июля 2009

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

Например, удаление пробелов и новостных лент из:
\ n <идентификатор узла = "что угодно">

чтобы получить:
<идентификатор узла = "что угодно">

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

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

Ответы [ 5 ]

6 голосов
/ 07 октября 2009

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

doc = Nokogiri(xml_source)
doc.xpath('//text()[not(normalize-space())]').remove
6 голосов
/ 20 июля 2009

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

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

2 голосов
/ 20 июля 2009

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

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

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

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

1 голос
/ 20 июля 2009

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

1 голос
/ 20 июля 2009

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

...