Как добавить неэкранированные амперсанды в HTML с помощью Nokogiri:: XML::Builder
Вопрос
Я хотел бы добавить такие вещи, как маркированные точки "•" в HTML, используя XML Builder в Nokogiri, но все экранируется.Как мне предотвратить его экранирование?
Я бы хотел, чтобы результат был:
<span>•</span>
вместо того , чтобы:
<span>&#8226;</span>
Я просто делаю это:
xml.span {
xml.text "•\ "
}
Что я упускаю из виду?
Решение
Если вы определяете
class Nokogiri::XML::Builder
def entity(code)
doc = Nokogiri::XML("<?xml version='1.0'?><root>&##{code};</root>")
insert(doc.root.children.first)
end
end
тогда это
builder = Nokogiri::XML::Builder.new do |xml|
xml.span {
xml.text "I can has "
xml.entity 8665
xml.text " entity?"
}
end
puts builder.to_xml
урожайность
<?xml version="1.0"?>
<span>I can has • entity?</span>
PS это только обходной путь, для получения чистого решения, пожалуйста, обратитесь к libxml2
документация (Nokogiri построена на libxml2) для получения дополнительной помощи.Однако даже эти люди признайте, что обработка сущностей иногда может быть довольно ... эээ, громоздкой.
Другие советы
Когда вы устанавливаете текст элемента, вы действительно устанавливаете текст, а не исходный текст HTML. <
и &
не имеют какого-либо особого значения в простом тексте.
Так что просто введите маркер: '•'
. Конечно, ваш исходный код и ваш XML-файл должны будут использовать одну и ту же кодировку, чтобы получилось правильно. Если ваш XML-файл имеет формат UTF-8, а исходный код - нет, вам, вероятно, придется сказать '\xe2\x80\xa2'
, что представляет собой последовательность байтов UTF-8 для символа маркера в виде строкового литерала.
(В общем, не-ASCII-символы в Ruby 1.8 сложны. Байт-интерфейсы не слишком хорошо сочетаются с миром XML «весь текст в юникоде».)