Я работаю с XML-кодом, который включает в себя несколько пространств имен (в частности, ResourceSync, который включает теги с пространством имен). в документах Sitemap).
Когда я создаю элементы REXML, я могу установить глобальное пространство имен:
foo = REXML::Element.new('foo')
foo.add_namespace('http://foo.com/')
puts foo # outputs <foo xmlns='http://foo.com/'/>
и я могу создать пространство имен с префиксом:
foo.add_namespace('bar', 'http://bar.org/')
puts foo # outputs <foo xmlns:bar='http://bar.org/' xmlns='http://foo.com/'/>
Однако если я затем добавлю еще один элемент с тем же URI пространства имен, что и префикс, но без явного использования префикса --
bar = REXML::Element.new('bar')
bar.add_namespace('http://bar.org/')
foo.add_element(bar)
-- REXML недостаточно умен, чтобы заметить наличие префикса и использовать его. Вместо ожидаемого
<foo xmlns:bar='http://bar.org/' xmlns='http://foo.com/'>
<bar:bar/>
</foo>
Я получаю излишне многословное:
<foo xmlns:bar='http://bar.org/' xmlns='http://foo.com/'>
<bar xmlns='http://bar.org/'/>
</foo>
Я мог бы обойти это, полностью игнорируя URI пространства имен и просто взломав префикс в имени элемента:
baz = REXML::Element.new('bar:baz')
foo.add_element(baz)
Однако во время создания элемента единственное, что я знаю наверняка, это URI пространства имен — я не знаю, к какому родительскому элементу он будет добавлен или какие префиксы пространства имен могут там существовать. (И в любом случае префиксы пространств имен на самом деле не являются частью логической модели документа, в отличие от URI пространств имен.)
Есть ли способ заставить REXML разрешать префиксы во время вывода и/или простой способ постобработки документа REXML для использования префиксов?
Обратите внимание, что я не ищу, например. решение Nokogiri, так как я использую библиотеку xml-mapping, которая использует REXML для внутреннего использования (похоже, у него также нет концепции пространств имен, но я нашел способ обойти это).