2012-02-13 16 views
6

Estoy tratando de validar un documento XML en una docena de esquemas usando Nokogiri. Actualmente tengo un documento de esquema raíz que importa todos los demás esquemas, y valido en contra de eso.Validación de esquema usando Nokogiri

¿Puedo apuntar a cada archivo de esquema desde el archivo XML en sí, y hacer que Nokogiri mire en el archivo XML para que los esquemas validen?

Respuesta

7

La forma correcta de hacer referencia a varios esquemas contra el que validar un archivo XML es con el atributo schemaLocation:

<?xml version="1.0"?> 
<foo xmlns="http://bar.com/foo" 
    xmlns:bz="http://biz.biz/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://bar.com/foo http://www.bar.com/schemas/foo.xsd 
         http://biz.biz/ http://biz.biz/xml/ns/bz.xsd"> 

Para cada espacio de nombres en el documento lista un par de valores delimitadas por espacio: el espacio de nombres URI seguido de una "sugerencia" sobre dónde encontrar el esquema para ese espacio de nombres. Si usted proporciona un URI completa para cada pista, a continuación, puede procesar esto con Nokogiri como tal:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri.XML(my_xml) 
schemata_by_ns = Hash[ doc.root['schemaLocation'].scan(/(\S+)\s+(\S+)/) ] 
schemata_by_ns.each do |ns,xsd_uri| 
    xsd = Nokogiri::XML.Schema(open(xsd_uri)) 
    xsd.validate(doc).each do |error| 
    puts error.message 
    end 
end 

responsabilidad: Nunca ha intentado validar un único documento XML utilizando esquemas múltiples de espacio de nombres con Nokogiri antes. Como tal, no tengo experiencia directa para garantizar que la validación anterior funcione. El código de validación se basa únicamente en Nokogiri's schema validation documentation.

+3

@jkjustjoshing ¿Responde mejor a esta pregunta o no solucionó su problema? – Phrogz

+0

acabo de darme cuenta de que nunca acepté su respuesta. Finalmente lo hizo! – jkjustjoshing

+0

tuvo que ajustar este 'doc.root ['xsi: schemaLocation']' – James

Cuestiones relacionadas