2009-11-28 1 views
2

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

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

<span>&#8226;</span> 

вместо:

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

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

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

Что мне не хватает?

ответ

2

Если определить

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) для получения дополнительной помощи. Однако даже эти люди admit that handling entities can be quite ..err, cumbersome sometimes.

+0

благодарит адриана, что такое " сущность ", и где вы получили 8665? –

+0

если я делаю 8226 вместо 8665, он анализирует его на «бык»; :/ –

+0

К сожалению, я ошибся 8665 для 8226! Сущность - это правильное имя для '&thing;' последовательностей. '•' должно быть в порядке, это официальное название этого объекта в HTML. '' см. Http://www.w3.org/TR/WD-html40-970708/sgml/entities. HTML – akuhn

0

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

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

(В общих символов не-ASCII в Ruby 1.8 хитры. Интерфейсы байт на основе не сетка слишком хорошо с миром XML, всего-текста-это-Unicode.)

+0

Мне нужно, чтобы результат был «•», поэтому «\ xe2 \ x80 \ xa2» не работает:/ –

+0

Почему вы * нуждаетесь в этой конкретной экранированной версии? Если у вас проблемы с кодировкой, поэтому • не отображается, как вы его набираете, тогда вы должны попытаться исправить это, установив правильное кодирование, а не прибегая к HTML-экранам. (В то время как в других средах вы можете попросить сериализатора HTML избежать всех символов, отличных от ASCII, до HTML-амперсандов, чтобы обойти это, Ruby в настоящее время не поддерживает этот уровень поддержки Unicode.) – bobince

Смежные вопросы