7

REXMLモジュールはRELAXNG検証をサポートしているように見えますがドキュメントにはフレームワークの検証部分の使用に関する実際の情報がありません。

RELAX NGスキーマを使用してXMLドキュメントをどのように検証しますか?コードスニペットが最も役立ちます。TIA!

4

2 に答える 2

6

私はNokogiriで成功しました gemから切り替えた後、libxml-rubyv1.1.3で毎回セグメンテーション違反が発生したため、変更ログにはいくつかのWindowsセグメンテーション違反の問題が解決されたと記載されています)。

これが私が使用しているコードです:

まず、Nokogiriをインストールします。問題が発生した場合は、インストールチュートリアルをご覧ください。

gem install nokogiri

Railsで実行している場合は、"でgemを構成します"Rails.root/config/enviroment.rb。例:

config.gem 'nokogiri'

逆に、require "nokogiriRubyを実行している場合。

事前定義されたRelaxNGスキーマに基づいてXMLドキュメントを検証するには(ファイルはに格納されていると想定します'public')、次のスニペットを使用します。

schema_path = "public/mySchema.rng"    # Or any valid path to a .RNG File
doc_path    = "public/myInstance.xml"  # Or any valid path to a .XML File

schema = Nokogiri::XML::RelaxNG(File.open(schema_path))

instance = Nokogiri::XML(File.open(doc_path))
errors = schema.validate(instance)

is_valid = errors.empty?

お役に立てれば !

于 2010-03-25T10:00:29.943 に答える
6

さて、プログラムを作成しましたが、結果は良くありません。

私の結論は次のとおりです。

  1. rexmlrelaxngスキーマ解析はおそらく機能しません。コードはそれが不完全であると述べています
  2. rexmlプル解析はおそらく機能しますが、わかりにくいです
  3. 上記の両方は文書化されていません
  4. libxmlなどの実際のXMLライブラリを使用する必要があります

これが私のテストプログラムです:test.rb

require 'rexml/validation/relaxng.rb'
require 'rexml/parsers/pullparser.rb'

# USAGE: ruby test.rb XML-FILE
xml = ARGV[0]

# schema must be a Relax NG XML (NOT compact / .rnc)
schema = File.new( "example.rng" )
validator = REXML::Validation::RelaxNG.new( schema )

# The structure the validator made, which should be a complex structure but isn't
validator.dump

xmlfile = File.new( xml )
parser = REXML::Parsers::PullParser.new( xmlfile )
while parser.has_next?
  # Returns an PullEvent
  e = parser.pull
  # puts "Event ", e.inspect
  validator.validate(e)
end

そして、おもちゃのサンプルXMLファイルとRNGファイルをいくつか作成し、OSX 10.5.xで試してみました(読みやすくするために長い行が壊れています)。

$ /usr/bin/ruby test.rb good.xml 
< S.1 #{doc}, :end_document(  ) >
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rexml/
  validation/validation.rb:24:in `validate': Validation error.  Expected:
  :start_element( doc ) from < S.1 #:start_element( doc ), {head}, {body},
  :end_element(  ), :end_document(  ) >  but got "doc"(  )
  (REXML::Validation::ValidationException)
        from test.rb:20

(1.9でも同じです)

だから、ほとんど失敗。

(add_listenerを使用するようにテストプログラムをさらに最適化することもできましたが、価値がないようでした)

于 2009-06-01T03:43:04.553 に答える