2009-11-28 60 views

回答

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

感谢adrian,什么是“实体“,你从哪里得到8665? – 2009-11-29 01:46:16

+0

如果我做的是8226而不是8665,它会解析为“bull”。 :/ – 2009-11-29 01:51:51

+0

哎呀,我误以为8665为8226! 实体是“&thing;”序列的正确名称。 '•'应该没关系,它是HTML中该实体的正式名称。 '<!ENTITY bull CDATA“•” - bullet,= black small circle,u + 2022 ISOpub - >'see http://www.w3.org/TR/WD-html40-970708/sgml/entities。 HTML – akuhn 2009-11-29 09:37:27

0

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

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

(在Ruby 1.8中一般非ASCII字符是棘手。基于字节接口不与XML世界网太清楚了所有的文本是Unicode的。)

+0

我需要结果为“•”,所以'\ xe2 \ x80 \ xa2'不起作用:/ – 2009-11-29 01:54:26

+0

为什么你需要*那个特殊的逃脱版本?如果你编码有问题,所以不会像你输入那样出现,那么你应该尝试通过设置你的编码来解决这些问题,而不是诉诸于HTML转义。 (在其他环境中,您可能会要求您的HTML序列化程序将所有非ASCII字符都转义为HTML-&符号序列以解决此问题,但Ruby目前没有该级别的Unicode支持。) – bobince 2009-11-29 02:12:46

相关问题