Nokogiriを使用して、数十程度のスキーマに対してXMLドキュメントを検証しようとしています。現在、私は他のすべてのスキーマをインポートするルートスキーマ文書を持っており、それに対して検証します。Nokogiriを使用したスキーマ検証
XMLファイル自体から各スキーマファイルを指し、Nokogiriが検証するスキーマをXMLファイルで調べることはできますか?
Nokogiriを使用して、数十程度のスキーマに対してXMLドキュメントを検証しようとしています。現在、私は他のすべてのスキーマをインポートするルートスキーマ文書を持っており、それに対して検証します。Nokogiriを使用したスキーマ検証
XMLファイル自体から各スキーマファイルを指し、Nokogiriが検証するスキーマをXMLファイルで調べることはできますか?
XMLファイルの妥当性を検証するための複数のスキーマを参照するための適切な方法は、schemaLocation
属性である:名前空間URI:あなたは空白で区切られた値のペアをリスト、ドキュメント内の各名前空間の
<?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を提供した場合は、次のような鋸山でこれを処理することができます
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's schema validation documentationのみに基づいています。
@jkjustjoshingこの回答はあなたを助けたり問題を解決したりしませんか? – Phrogz
私はあなたの答えを決して受け入れなかったことを実感しました。最後にやった! – jkjustjoshing
は、この 'doc.root ['xsi:schemaLocation']'を微調整しなければなりませんでした – James