2012-02-13 16 views
6

Próbuję zweryfikować dokument XML na kilkunastu schematach za pomocą Nokogiri. Obecnie mam dokument schematu root, który importuje wszystkie pozostałe schematy i potwierdzam to.Walidacja schematu za pomocą Nokogiri

Czy mogę wskazać każdy plik schematu z pliku XML i sprawdzić, czy Nokogiri znajduje się w pliku XML w celu sprawdzenia poprawności schematów?

Odpowiedz

7

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.

+3

@jkjustjoshing Czy ta odpowiedź nie pomoże Ci rozwiązać problemu? – Phrogz

+0

Właśnie zdałem sobie sprawę, że nigdy nie przyjąłem twojej odpowiedzi. W końcu to zrobiłem! – jkjustjoshing

+0

musiałem zmodyfikować to 'doc.root ['xsi: schemaLocation'] – James

Powiązane problemy