Проверка схемы с использованием Nokogiri - PullRequest
6 голосов
/ 13 февраля 2012

Я пытаюсь проверить XML-документ по дюжине или около того схем, используя Nokogiri. В настоящее время у меня есть документ корневой схемы, который импортирует все другие схемы, и я проверяю это.

Могу ли я указать на каждый файл схемы из самого файла XML, и чтобы Nokogiri проверил в файле XML схемы для проверки?

1 Ответ

7 голосов
/ 15 февраля 2012

Правильный способ ссылки на несколько схем для проверки 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до.Таким образом, у меня нет прямого опыта, чтобы гарантировать, что вышеуказанная проверка будет работать.Код проверки основан исключительно на документации по проверке схемы Нокогири .

...