Как добавить неэкранированные амперсанды в HTML с помощью Nokogiri:: XML::Builder

StackOverflow https://stackoverflow.com/questions/1811856

Вопрос

Я хотел бы добавить такие вещи, как маркированные точки "•" в HTML, используя XML Builder в Nokogiri, но все экранируется.Как мне предотвратить его экранирование?

Я бы хотел, чтобы результат был:

<span>&#8226;</span> 

вместо того , чтобы:

<span>&amp;#8226;</span> 

Я просто делаю это:

xml.span { 
  xml.text "&#8226;\ " 
}

Что я упускаю из виду?

Это было полезно?

Решение

Если вы определяете

  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 &#x2022; entity?</span>

 

PS это только обходной путь, для получения чистого решения, пожалуйста, обратитесь к libxml2 документация (Nokogiri построена на libxml2) для получения дополнительной помощи.Однако даже эти люди признайте, что обработка сущностей иногда может быть довольно ... эээ, громоздкой.

Другие советы

Когда вы устанавливаете текст элемента, вы действительно устанавливаете текст, а не исходный текст HTML. < и & не имеют какого-либо особого значения в простом тексте.

Так что просто введите маркер: '•'. Конечно, ваш исходный код и ваш XML-файл должны будут использовать одну и ту же кодировку, чтобы получилось правильно. Если ваш XML-файл имеет формат UTF-8, а исходный код - нет, вам, вероятно, придется сказать '\xe2\x80\xa2', что представляет собой последовательность байтов UTF-8 для символа маркера в виде строкового литерала.

(В общем, не-ASCII-символы в Ruby 1.8 сложны. Байт-интерфейсы не слишком хорошо сочетаются с миром XML «весь текст в юникоде».)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top