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.
@jkjustjoshing ¿Responde mejor a esta pregunta o no solucionó su problema? – Phrogz
acabo de darme cuenta de que nunca acepté su respuesta. Finalmente lo hizo! – jkjustjoshing
tuvo que ajustar este 'doc.root ['xsi: schemaLocation']' – James