如何使用Nokogiri :: XML :: Builder将非转义的&符号添加到HTML中

时间:2009-11-28 07:18:01

标签: html xml utf-8 escaping nokogiri

我想使用Nokogiri中的XML Builder向HTML添加诸如“•”的内容,但所有内容都被转义。如何防止它被转义?

我希望结果是:

<span>&#8226;</span> 

而不是:

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

我只是这样做:

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

我错过了什么?

2 个答案:

答案 0 :(得分:3)

如果你定义

  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

答案 1 :(得分:0)

当您设置元素的文本时,您确实在设置文本,而不是HTML源。 <&在纯文本中没有任何特殊含义。

所以只需输入一个子弹:'•'。当然,您的源代码和XML文件必须使用相同的编码才能正确显示。如果你的XML文件是UTF-8但你的源代码不是,你可能不得不说'\xe2\x80\xa2'这是子弹字符的UTF-8字节序列作为字符串文字。

(一般情况下,Ruby 1.8中的非ASCII字符很棘手。基于字节的接口与XML的全文是Unicode的世界不太匹配。)