2009-12-25 19 views
4

J'utilise nokogiri pour générer des images svg. Je voudrais ajouter le préambule XML correct et la déclaration DTD svg pour obtenir quelque chose comme:Ajouter un dtd en utilisant nokogiri builder

<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg> 
... 

Avec builder je pouvais utiliser instruct! et declare! mais je veux rester avec nokogiri parce que je l'utilise à d'autres fins dans mon projet et je veux rester bas sur les exigences. Avez-vous des idées?

Merci

Répondre

2

Vous pouvez maintenant (ne sais pas de quelle version) utiliser Node # create_internal_subset pour créer le nœud DTD. Pour plus d'informations, voir: http://nokogiri.org/Nokogiri/XML/Builder.html

Et faites défiler jusqu'à la section "Types de document" pour un exemple.

0

Il ne semble pas être un moyen d'ajouter un type de document à l'aide Nokogiri::XML::Builder. Cependant, l'ajout d'une déclaration doctype à un document XML est d'une utilité douteuse, sauf si vos outils l'exigent. Lisez DTDs Don't Work on the Web by Henri Sivonen pour quelques raisons qui expliquent pourquoi ce n'est pas une bonne idée d'utiliser des DTD, et assurez-vous que votre document est bien formé et validez-le par rapport à un schéma externe (qui peut être une DTD ou quelque chose de plus puissant comme XSD ou RELAX-NG) plutôt qu'une DTD incorporée dans le document.

+1

<!DOCTYPE html> Je suis d'accord, mais je dois aussi ajouter une DTD au document ... – paradigmatic

1

Voici une solution possible, mais il ressemble à un sale tour:

#1. I build the svg document 
builder = Nokogiri::XML::Builder.new do |xml| 
    xml.svg do 
    # ... 
    end 
end 

#2. I retrieve the svg root node 
svg = builder.doc.xpath("/svg").first 

#3. I define and parse an xml document with the required preamble and dtd 
str =<<EOS 
<?xml version="1.0" standalone="no"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1. /DTD/svg11.dtd"> 
EOS 
doc = Nokogiri::XML::Document.parse(str) 

#4. I add the svg node to the document above 
doc.add_child(svg) 
4

Voici un extrait d'une note en bas de la Nokogiri::XML::Builder page (peut-être ajouté récemment), qui je pense fera l'affaire:

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.doc.create_internal_subset(
    'html', 
    "-//W3C//DTD HTML 4.01 Transitional//EN", 
    "http://www.w3.org/TR/html4/loose.dtd" 
) 
    xml.root do 
    xml.foo 
    end 
end 

puts builder.to_xml 
0

Pour ceux qui travaillent avec le HTML, l'exemple d'Eric marcheurs ne pas tout à fait travailler depuis un doctype est automatiquement ajouté. Vous devez d'abord le supprimer:

builder = Nokogiri::HTML::Builder.new do |html| 
    html.doc.internal_subset.remove 
    html.doc.create_internal_subset('html', nil, nil) 
end 

Cela ajoutera le doctype HTML5

alias