2009-08-17 9 views
12

J'ai trouvé quelques articles faisant allusion au fait que vous pouvez valider XHTML contre sa DTD en utilisant la gemme nokogiri. Alors que j'ai réussi à l'utiliser pour analyser XHTML avec succès (en recherchant des balises 'a' etc.), j'ai du mal à valider les documents.Comment valider XHTML avec nokogiri?

Pour moi, ceci:

doc = Nokogiri::XML(Net::HTTP.get(URI.parse("http://www.w3.org"))) 
puts doc.validate 

résultats dans un tas de:

[ 
#<Nokogiri::XML::SyntaxError: No declaration for element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute xmlns of element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute lang of element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute lang of element html>, 
#<Nokogiri::XML::SyntaxError: No declaration for element head>, 
#<Nokogiri::XML::SyntaxError: No declaration for attribute profile of element head 
[repeat for every tag in the document.] 
] 

Je suppose donc que ce n'est pas la bonne approche. Je n'arrive pas à trouver de bons exemples - quelqu'un peut-il suggérer ce que je fais de mal?

Je cours ruby ​​1.8.6 sur Mac OSX 10.5.8. Nokogiri me dit:

nokogiri: 1.3.3 
warnings: [] 

libxml: 
    compiled: 2.6.23 
    loaded: 2.6.23 
    binding: extension 

Répondre

14

Ce n'est pas seulement vous. Ce que vous faites est censé être la bonne façon de le faire, mais je n'ai jamais eu de chance avec ça. Autant que je sache, il y a une déconnexion quelque part entre Nokogiri et libxml, ce qui fait qu'elle ne charge pas les DTD SYSTEM, ou qu'elle reconnaît PUBLIC DTD. Il fonctionnera si vous définissez la DTD dans le fichier XML, mais bonne chance de le faire avec les DTD XHTML.

La meilleure chose que je peux recommander est d'utiliser le schemas for XHTML à la place:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::XML(open('http://www.w3.org')) 
xsd = Nokogiri::XML::Schema(open('http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd')) 

#this is a true/false validation 
xsd.valid?(doc) # => true 

#this gives a listing of errors 
xsd.validate(doc) # => [] 
+0

C'est génial - il est certainement me produire d'aspect raisonnable des résultats (un coup d'oeil!). Bien que, curieusement, certaines pages que je valide produisent des piles d'avertissements "Unimplemented block at xmlschemas.c: 27443" - mais continuent à signaler qu'elles sont valides sans erreurs. Je ne suis pas au bout du schéma de ce que sont et ne sont pas en ce moment. – NeilS

1

Il fonctionne bien si la DTD est intégrée dans le fichier XML. Donc, si la restructuration des données dans un seul fichier est acceptable, soit en général, soit simplement pour un usage temporaire, cela résoudrait votre problème.

J'ai déposé un problème avec le projet Nokogiri à:

https://github.com/sparklemotion/nokogiri/issues/440

Yoko Harada, auteur principal de JRuby Nokigiri, a déclaré:

« Just FYI pure Java Nokogiri sur la branche principale (non. encore publié) n'a pas ce problème. "

Le problème que j'ai classé contient des liens vers des exemples de fichiers minimaux et des appels IRB pour illustrer le problème.

  • Keith
Questions connexes