2012-02-13 43 views
6

Tôi đang cố gắng xác thực tài liệu XML dựa trên một tá hoặc nhiều lược đồ sử dụng Nokogiri. Hiện tại tôi có một tài liệu lược đồ gốc để nhập khẩu tất cả các lược đồ khác và tôi xác thực điều đó.Xác nhận lược đồ bằng cách sử dụng Nokogiri

Tôi có thể trỏ đến từng tệp lược đồ từ chính tệp XML và có Nokogiri tìm trong tệp XML để các lược đồ xác thực không?

Trả lời

7

Cách thích hợp để tham khảo nhiều lược đồ dựa vào đó để xác nhận một tập tin XML là với schemaLocation thuộc tính:

<?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"> 

Đối với mỗi không gian tên trong tài liệu của bạn, bạn liệt kê một cặp giá trị khoảng trắng được phân định: namespace URI theo sau là một 'gợi ý' về vị trí tìm giản đồ cho không gian tên đó. Nếu bạn cung cấp một URI đầy đủ cho mỗi gợi ý, sau đó bạn có thể xử lý này với Nokogiri như vậy:

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 

Disclaimer: Tôi chưa bao giờ cố gắng để xác nhận một tài liệu XML đơn sử dụng nhiều lược đồ namespaced với Nokogiri trước. Vì vậy, tôi không có kinh nghiệm trực tiếp để đảm bảo rằng việc xác nhận ở trên sẽ hoạt động. Mã xác thực chỉ dựa trên Nokogiri's schema validation documentation.

+3

@jkjustjoshing Câu trả lời này không giúp bạn hoặc giải quyết vấn đề của bạn? – Phrogz

+0

vừa nhận ra tôi chưa bao giờ chấp nhận câu trả lời của bạn. Cuối cùng đã làm nó! – jkjustjoshing

+0

phải chỉnh sửa 'doc.root ['xsi: schemaLocation']' này – James

Các vấn đề liên quan