Как я могу отобразить ссылки на сущности символов XML в Ruby? - PullRequest
0 голосов
/ 10 марта 2011

Я читаю некоторые данные из веб-службы XML с помощью Ruby, что-то вроде этого:

<phrases>
  <phrase language="en_US">&iexcl;I&#39;m highly&nbsp;annoyed with character references!</phrase>
</phrases>

Я анализирую XML и собираю массив фраз.Как видите, текст фразы содержит несколько ссылок на символы XML .Я хотел бы заменить их реальным персонажем, на который ссылаются.Это достаточно просто с числовыми ссылками, но неприятно с XML и HTML.Я хотел бы избежать большого хэша в моем коде, который содержит символ для каждой ссылки на символ XML или HTML, например http://www.java2s.com/Code/Java/XML/Resolvesanentityreferenceorcharacterreferencetoitsvalue.htm

Конечно, есть библиотека для этого, верно?

Обновление

Да, есть библиотека, которая называется HTMLEntities :

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

REXML может сделать это, хотя он не будет обрабатывать "& iexcl;" или "& nbsp;". Список предопределенных сущностей XML (кроме числовых сущностей Unicode) на самом деле довольно мал. Смотри http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

Учитывая этот входной XML:

<phrases>
  <phrase language="en_US">&quot;I&#39;m highly annoyed with character references!&#x00a9;</phrase>
</phrases>

Вы можете анализировать XML и встроенные объекты, например, так:

require 'rexml/document'

doc = REXML::Document.new(File.open('/tmp/foo.xml').readlines.join(''))
phrase = REXML::XPath.first(doc, '//phrases/phrase')
text = phrase.first # Type is REXML::Text
puts(text.value)

Очевидно, что в этом примере предполагается, что XML находится в файле /tmp/foo.xml. Вы также можете легко передать строку XML. На моих компьютерах Mac и Ubuntu при его запуске выдается:

$ ruby /tmp/foo.rb
"I'm highly annoyed with character references!©
1 голос
/ 10 марта 2011

Это не попытка предложить решение, а рассказать о моем собственном опыте работы с XML с нуля. Сначала я использовал Perl, а затем - Ruby, и с этим опытом вы можете легко столкнуться, если захватите достаточно каналов XML или RDF / RSS / Atom.

Я часто видел, что XML CDATA содержит HTML, как кодированный, так и не кодированный. Кодированный HTML, вероятно, был результатом того, что кто-то делал все правильно, через какой-то API или библиотеку для генерации XML. Вероятно, незашифрованный HTML был кем-то, кто использовал скрипт, чтобы обернуть HTML тегами, что привело к неправильному XML, но мне все равно пришлось иметь дело с ним.

Я также видел XML CDATA, содержащий HTML, который был закодирован несколько раз, требуя, чтобы я расшифровал все, даже после того, как механизм XML сделал свое дело. Иногда во время промежуточного прохода у меня внезапно появлялись не-UTF8 символы в строке вместе с закодированными, потому что кто-то добавлял комментарии или объединял несколько потоков HTML, которые были из разных наборов символов. По какой бы то ни было причине, это было ужасно и приводило к тому, что синтаксический анализ XML прерывался или выдавал много предупреждений. Мне пришлось бы перебирать содержимое, декодировать и проверять, чтобы увидеть, был ли предыдущий проход таким же, как текущий проход декодирования, и выписываться, если ничего не изменилось. Не было никакой гарантии, что у меня будет строка в допустимом наборе символов в то время, поэтому я должен сказать iconv преобразовать ее в UTF8 и выбросить символы, которые не будут конвертироваться чисто.

Nokogiri может декодировать содержимое узла различными способами, творчески используя методы to_xml и to_html. Вы также можете посмотреть на самоцвет HTMLEntities, Loofah и другие, чтобы узнать содержание CDATA. Люфа хороша тем, что она предназначена для включения в белый / черный список тегов, с которыми вы можете столкнуться.

Спецификация XML должна защищать нас от таких махинаций, но, как говорил один из моих коллег, «мы можем сделать ее надежной, но не чертовски защищенной». Люди НАСТОЛЬКО изобретательны, и спецификации ничего не значат для тех, кто не удосужился их прочитать или им все равно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...