Właściwym sposobem odwołać wiele schematów, przeciwko którym do sprawdzania poprawności pliku XML jest z atrybutem 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">
Dla każdej przestrzeni nazw w dokumencie Ci notować parę wartości białych rozdzielany: obszaru nazw URI a następnie "podpowiedź", gdzie znaleźć schemat dla tej przestrzeni nazw. Jeśli podasz pełny URI dla każdego śladu, a następnie można przetworzyć ten z Nokogiri jako takie:
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
Oświadczenie: Nigdy nie próbował zweryfikować pojedynczy dokument XML przy użyciu wielu przestrzeni nazw schematów z Nokogiri wcześniej. Jako takie, nie mam bezpośredniego doświadczenia, aby zagwarantować, że powyższa walidacja zadziała. Kod weryfikacyjny opiera się wyłącznie na Nokogiri's schema validation documentation.
@jkjustjoshing Czy ta odpowiedź nie pomoże Ci rozwiązać problemu? – Phrogz
Właśnie zdałem sobie sprawę, że nigdy nie przyjąłem twojej odpowiedzi. W końcu to zrobiłem! – jkjustjoshing
musiałem zmodyfikować to 'doc.root ['xsi: schemaLocation'] – James