Как я могу сделать пустые теги самозакрывающимися с Nokogiri? - PullRequest
5 голосов
/ 28 марта 2011

Я создал шаблон XML в ERB. Я заполняю его данными из базы данных во время процесса экспорта.

В некоторых случаях есть нулевое значение, и в этом случае элемент может быть пустым, например:

<someitem>

</someitem>

В этом случае клиент, получающий экспорт, хочет преобразовать его в самозакрывающийся тег:

<someitem/>

Я пытаюсь понять, как заставить Нокогири сделать это, но пока не вижу. Кто-нибудь знает, как сделать пустые теги XML самозакрывающимися с Nokogiri?

Обновление

Регулярного выражения было достаточно, чтобы сделать то, что я указал выше, но теперь клиент также хочет, чтобы теги, чьи дочерние элементы были пустыми, были самозакрывающимися. Итак, это:

<someitem>
  <subitem>

  </subitem>
  <subitem>

  </subitem>
</someitem>

... также должно быть

<someitem/>

Я думаю, что это потребует использования Нокогири.

Ответы [ 2 ]

5 голосов
/ 28 марта 2011

Найдите

<([^>]+)>\s*</\1>

и замените на

<\1/>

в рубине:

result = subject.gsub(/<([^>]+)>\s*<\/\1>/, '<\1/>')

Объяснение:

<       # Match opening bracket
(       # Match and remember...
 [^>]+  # One or more characters except >
)       # End of capturing group
>       # Match closing bracket
\s*     # Match optional whitespace & newlines
<       # Match opening bracket
/       # Match /
\1      # Match the contents of the opening tag
>       # Match closing bracket
1 голос
/ 28 марта 2011

Пара вопросов:

  1. <foo></foo> - это то же самое, что и <foo />, так зачем беспокоиться о такой крошечной детали? Если это синтаксически значимо, потому что текстовый узел между ними - "\n", тогда поместите тест в свой шаблон ERB, который проверяет значение, которое будет там идти, и если он не инициализирован, вместо этого выведите самозакрывающийся тег? Смотрите " Як для бритья ".
  2. Зачем привлекать Нокогири? Вы должны быть в состоянии генерировать правильный XML в ERB, так как вы контролируете шаблон.

РЕДАКТИРОВАТЬ - Поведение Nokogiri заключается в том, чтобы не переписывать проанализированный XML, если в этом нет необходимости. Я подозреваю, что вам придется удалить рассматриваемый узел, а затем снова вставить его как пустой узел, чтобы Nokogiri выдал то, что вы хотите.

...