2009-08-17 17 views
12

Ho trovato alcuni post che alludono al fatto che è possibile convalidare XHTML contro il suo DTD usando la gemma nokogiri. Mentre sono riuscito a usarlo per analizzare XHTML con successo (cercando tag 'a', ecc.), Sto faticando a convalidare i documenti.Come convalido XHTML con nokogiri?

Per me, questo:

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

risultati in un mucchio di:

[ 
#<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.] 
] 

Così sto supponendo che non è l'approccio giusto. Non riesco a trovare alcun buon esempio - qualcuno può suggerire cosa sto facendo male?

Sto eseguendo Ruby 1.8.6 su Mac OS X 10.5.8. Nokogiri mi dice:

nokogiri: 1.3.3 
warnings: [] 

libxml: 
    compiled: 2.6.23 
    loaded: 2.6.23 
    binding: extension 

risposta

14

Non è solo per te. Quello che stai facendo dovrebbe essere il modo giusto per farlo, ma non ho mai avuto fortuna con esso. Per quanto ne so, c'è qualche disconnessione tra Nokogiri e libxml che gli impedisce di caricare DTD SYSTEM o di riconoscere DTD PUBLIC. È funziona se si definisce il DTD all'interno del file XML, ma buona fortuna farlo con il DTD XHTML.

La cosa migliore che posso consigliare è quello di utilizzare invece il schemas for XHTML:

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

che è grande - è certamente la produzione di me ragionevole dall'aspetto risultati (a colpo d'occhio!). Anche se, stranamente, alcune pagine che sto convalidando producono pile di avvertimenti "Unimplemented block at xmlschemas.c: 27443" - ma poi procedono a segnalare che sono validi senza errori. Non sono arrivato al fondo del modello di quelli che sono e non sono a questo punto. – NeilS

1

Funziona bene se il DTD è incorporato nel file XML. Quindi, se la ristrutturazione dei dati in un singolo file è ok, sia come pratica generale, o solo per uso temporaneo, ciò risolverebbe il tuo problema.

ho depositato un problema con il progetto Nokogiri a:

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

Yoko Harada, autore principale di JRuby Nokigiri, ha detto:

"Cordiali saluti Pure Nokogiri Java sul branch master (non. ancora rilasciato) non ha questo problema. "

Il problema archiviato contiene collegamenti a file di esempio minimi e chiamate IRB per illustrare il problema.

  • Keith