2009-08-17 21 views
12

He encontrado algunas publicaciones alusivas al hecho de que puedes validar XHTML contra su DTD usando la gema nokogiri. Aunque he logrado usarlo para analizar XHTML con éxito (buscando etiquetas 'a', etc.), estoy luchando para validar documentos.¿Cómo valido XHTML con nokogiri?

Para mí, esto:

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

resultados en un montón de todo:

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

así que estoy asumiendo que no es el enfoque correcto. Parece que no puedo encontrar ningún buen ejemplo: ¿alguien puede sugerir lo que estoy haciendo mal?

Estoy ejecutando ruby ​​1.8.6 en Mac OSX 10.5.8. Nokogiri me dice:

nokogiri: 1.3.3 
warnings: [] 

libxml: 
    compiled: 2.6.23 
    loaded: 2.6.23 
    binding: extension 

Respuesta

14

No eres solo tú. Se supone que lo que estás haciendo es la forma correcta de hacerlo, pero nunca he tenido suerte. Por lo que puedo decir, hay una desconexión en algún lugar entre Nokogiri y libxml que hace que no cargue las DTD SYSTEM, o que reconozca PUBLIC DTD. Es funcionar si define la DTD dentro del archivo XML, pero buena suerte hacerlo con las DTD XHTML.

Lo mejor que puedo recomendar es utilizar el schemas for XHTML lugar:

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

Eso es grande - es sin duda la producción de mí razonable de aspecto resultados (de un vistazo!). Aunque, curiosamente, algunas páginas que estoy validando producen montones de advertencias de "Bloque no implementado en xmlschemas.c: 27443", pero luego proceden a informar que son válidas sin errores. No he llegado al final del patrón de cuáles son y no están en este punto. – NeilS

1

Funciona bien si el DTD está incrustado en el código XML. Entonces, si reestructurar los datos en un solo archivo está bien, ya sea como práctica general, o solo para uso temporal, eso resolvería su problema.

me presentó un problema con el proyecto Nokogiri en:

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

Yoko Harada, autor principal de JRuby Nokigiri, dijo:

"Lo digo Java puro Nokogiri en la rama principal (no. aún liberado) no tiene este problema ".

El problema que archivé contiene enlaces a archivos de ejemplo mínimos y llamadas a IRB para ilustrar el problema.

  • Keith
Cuestiones relacionadas