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
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top