【问题标题】:How to add non-escaped ampersands to HTML with Nokogiri::XML::Builder如何使用 Nokogiri::XML::Builder 向 HTML 添加非转义 & 符号
【发布时间】:2009-11-28 07:18:01
【问题描述】:

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

我希望结果是:

<span>&#8226;</span> 

而不是:

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

我只是这样做:

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

我错过了什么?

【问题讨论】:

    标签: html xml utf-8 escaping nokogiri


    【解决方案1】:

    如果你定义

      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

    【讨论】:

    • 谢谢阿德里安,什么是“实体”,你从哪里得到 8665?
    • 如果我使用 8226 而不是 8665,它会将其解析为“bull;” ://
    • 糟糕,我把 8665 误认为是 8226!实体是&amp;thing; 序列的正确名称。 &amp;bull; 应该没问题,它是该实体在 HTML 中的正式名称。 &lt;!ENTITY bull CDATA "&amp;#8226;" -- bullet, =black small circle, u+2022 ISOpub --&gt;w3.org/TR/WD-html40-970708/sgml/entities.html
    【解决方案2】:

    当您设置元素的文本时,您实际上是在设置文本,而不是 HTML 源代码。 &lt;&amp; 在纯文本中没有任何特殊含义。

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

    (一般来说,Ruby 1.8 中的非 ASCII 字符比较棘手。基于字节的接口与 XML 的 all-text-is-Unicode 世界不太吻合。)

    【讨论】:

    • 我需要得到带有“•”的结果,所以 '\xe2\x80\xa2' 不起作用:/
    • 为什么你需要那个特殊的转义版本?如果您遇到编码问题,因此 • 看起来不像您键入的那样,那么您应该尝试通过设置正确的编码而不是诉诸 HTML 转义来解决这些问题。 (虽然在其他环境中,您可能会要求您的 HTML 序列化程序将所有非 ASCII 字符转义为 HTML 与符号序列以解决此问题,但 Ruby 目前没有该级别的 Unicode 支持。)
    猜你喜欢
    • 2015-04-03
    • 2022-01-18
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多