Разбор XML-документа с тегами ‹% %› в ruby

Я ищу способ проанализировать документ xml/html в рубине, который содержит теги стиля ERB <% %> с рубиновым кодом внутри. REXML, встроенный анализатор XML, не позволит мне это сделать.

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

Есть ли способ заставить REXML быть менее строгим в отношении тегов? или заставить его распознавать этот тег? Любое другое решение?


person cloudhead    schedule 03.07.2009    source источник
comment
Вы хотите, чтобы код выполнялся, а его вывод интерполировался в XML, как файл .html.erb? Или вы хотите вернуть фактическое содержимое (сам код) узла?   -  person jason    schedule 03.07.2009
comment
Я хочу реальный исходный код. Я подумал, что могу просто сделать gsub(‹%, ‹ruby›).gsub(%›,‹/ruby›), но встроенный метод был бы великолепен.   -  person cloudhead    schedule 03.07.2009


Ответы (1)


Что ж, при условии, что вам нужен сам код Ruby, ваша проблема не в синтаксическом анализаторе, а в том, что ваш XML искажен.

Я все еще предполагаю, что ваш XML выглядит примерно так:

<parent>
    <node>
         <% some code here! %>
    </node>
</parent>

Если это действительно так, содержимое узла node (heh) должно фактически быть разделом CDATA. Итак, это должно выглядеть так:

<node><![CDATA[
     <% some code here! %>
]]></node>

Если вы сделаете это, REXML сможет правильно проанализировать файл XML и вернуть содержимое node, которое будет включать теги erb.

Если у вас нет контроля над созданием XML, вы можете, в качестве временного решения, просто (при условии, что любой заданный узел, содержащий ERB только, содержит ERB) выполнить поиск по всему файлу и замените для начального и конечного тегов кода и соответствующим образом добавьте/добавьте разметку CDATA. Вы можете легко автоматизировать это на своем языке, здесь на SO есть много примеров.

person jason    schedule 03.07.2009