¿Cómo valido XHTML con nokogiri?
Pregunta
He encontrado algunos mensajes que aluden al hecho de que puede validar XHTML DTD en contra de su uso de la gema nokogiri. Mientras me las he arreglado para utilizarlo para analizar XHTML éxito (en busca de 'a' etiquetas, etc.), estoy luchando para validar documentos.
Para mí, esto:
doc = Nokogiri::XML(Net::HTTP.get(URI.parse("http://www.w3.org")))
puts doc.validate
resultados en un montón entero 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.]
]
Así que estoy asumiendo que no es el enfoque correcto. Me parece que no puede localizar cualquier buenos ejemplos -? ¿Alguien puede sugerir lo que estoy haciendo mal
Estoy corriendo rubí 1.8.6 en Mac OS X 10.5.8. Nokogiri me dice:
nokogiri: 1.3.3
warnings: []
libxml:
compiled: 2.6.23
loaded: 2.6.23
binding: extension
Solución
No es sólo usted. Lo que está haciendo se supone que es la forma correcta de hacerlo, pero nunca he tenido ninguna suerte con él. Por lo que yo puedo decir, hay un poco de desconexión en algún lugar entre Nokogiri y libxml lo que provoca que se carga SYSTEM
DTD, o para reconocer las DTD PUBLIC
. Es de trabajo si se define el DTD dentro del archivo XML, pero la buena suerte de hacer eso con el XHTML DTD.
Lo mejor que puedo recomendar es utilizar la para XHTML en su 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) # => []
Otros consejos
Funciona bien si el DTD está incrustado en el código XML. Así que si la reestructuración de los datos en un solo archivo está bien, ya sea como práctica general, o simplemente para uso temporal, que resolvería su problema.
Yo presenté un problema con el proyecto Nokogiri en:
https://github.com/sparklemotion/nokogiri/issues/440
Yoko Harada, autor principal de JRuby Nokigiri, dijo:
"Para su información. Java puro Nokogiri en la rama principal (aún no publicado) no tiene este problema."
El tema que presenté contiene enlaces a archivos de ejemplo mínimos y llamadas IRB para ilustrar el problema.
- Keith