2009-11-28 5 views

Répondre

2

Si vous définissez

class Nokogiri::XML::Builder 
    def entity(code) 
     doc = Nokogiri::XML("<?xml version='1.0'?><root>&##{code};</root>") 
     insert(doc.root.children.first) 
    end 
    end 

alors ce

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 

cède

<?xml version="1.0"?> 
<span>I can has &#x2022; entity?</span> 

 

PS cette solution une seule, pour une solution propre s'il vous plaît se référer à la documentation libxml2 (Nokogiri est construit sur libxml2) pour plus d'aide. Cependant, même ces gens admit that handling entities can be quite ..err, cumbersome sometimes.

+0

merci adrian, qu'est ce qu'un " entité ", et où avez-vous eu 8665? –

+0

si je fais 8226 au lieu de 8665, il l'analyse en "taureau"; :/ –

+0

Oups, j'ai confondu 8665 pour 8226! Entité est le nom propre des séquences '&thing;'. '•' devrait être correct, c'est le nom officiel de cette entité en HTML. ''! ENTITY bull CDATA "•" - bullet, = petit cercle noir, u + 2022 ISOpub -> 'voir http://www.w3.org/TR/WD-html40-970708/sgml/entities. html – akuhn

0

Lorsque vous définissez le texte d'un élément, vous définissez réellement le texte, pas la source HTML. < et & n'ont pas de signification particulière en texte brut.

Alors tapez simplement une puce: '•'. Bien sûr, votre code source et votre fichier XML devront utiliser le même encodage pour que ça sorte. Si votre fichier XML est UTF-8 mais que votre code source ne l'est pas, vous devrez probablement indiquer '\xe2\x80\xa2' qui est la séquence d'octets UTF-8 pour le caractère de puce comme littéral de chaîne.

(en général des caractères non-ASCII dans Ruby 1.8 sont difficiles. L'octet basée sur les interfaces ne maille pas trop bien avec le monde XML de tout texte est Unicode.)

+0

Je dois avoir le résultat avec "•", donc '\ xe2 \ x80 \ xa2' ne fonctionne pas:/ –

+0

Pourquoi avez-vous besoin de cette version particulière? Si vous rencontrez des problèmes d'encodage, le • n'apparaît pas comme si vous l'aviez tapé, alors vous devriez essayer de les corriger en définissant votre encodage correctement plutôt que de recourir à des évasions HTML. (Alors que dans d'autres environnements, vous pourriez demander à votre sérialiseur HTML d'échapper tous les caractères non-ASCII aux séquences HTML-ampersand pour contourner cela, Ruby n'a actuellement pas ce niveau de support Unicode.) – bobince

Questions connexes