Это не попытка предложить решение, а рассказать о моем собственном опыте работы с 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 должна защищать нас от таких махинаций, но, как говорил один из моих коллег, «мы можем сделать ее надежной, но не чертовски защищенной». Люди НАСТОЛЬКО изобретательны, и спецификации ничего не значат для тех, кто не удосужился их прочитать или им все равно.