Правильный способ ссылки на несколько схем для проверки XML-файла - с атрибутом 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">
Для каждого пространства имен в вашем документе вы перечисляете парузначений, разделенных пробелами: URI пространства имен, за которым следует «подсказка» о том, где найти схему для этого пространства имен.Если вы предоставляете полный URI для каждой подсказки, то вы можете обработать это с помощью Nokogiri следующим образом:
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
Отказ от ответственности: Я никогда не пытался проверить один XML-документ с использованием нескольких схем с именами в пространстве с помощью Nokogiriдо.Таким образом, у меня нет прямого опыта, чтобы гарантировать, что вышеуказанная проверка будет работать.Код проверки основан исключительно на документации по проверке схемы Нокогири .