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.
@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
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
phải chỉnh sửa 'doc.root ['xsi: schemaLocation']' này – James