2009-11-28 31 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

相關問題