2012-02-13 19 views
6

Nokogiriを使用して、数十程度のスキーマに対してXMLドキュメントを検証しようとしています。現在、私は他のすべてのスキーマをインポートするルートスキーマ文書を持っており、それに対して検証します。Nokogiriを使用したスキーマ検証

XMLファイル自体から各スキーマファイルを指し、Nokogiriが検証するスキーマをXMLファイルで調べることはできますか?

答えて

7

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のみに基づいています。

+3

@jkjustjoshingこの回答はあなたを助けたり問題を解決したりしませんか? – Phrogz

+0

私はあなたの答えを決して受け入れなかったことを実感しました。最後にやった! – jkjustjoshing

+0

は、この 'doc.root ['xsi:schemaLocation']'を微調整しなければなりませんでした – James

関連する問題