REXML
モジュールはRELAX NG validationをサポートしているようですが、フレームワークの検証部分の使用に関する実際の情報はありません。RubyでRELAX NGを介してXMLを検証するにはどうすればよいですか?
どのようにRELAX NGスキーマを使用してXML文書を検証しますか?コードスニペットが最も役立ちます。 TIA!
REXML
モジュールはRELAX NG validationをサポートしているようですが、フレームワークの検証部分の使用に関する実際の情報はありません。RubyでRELAX NGを介してXMLを検証するにはどうすればよいですか?
どのようにRELAX NGスキーマを使用してXML文書を検証しますか?コードスニペットが最も役立ちます。 TIA!
私はプログラムを構築しましたが、結果は良くありません。次のように
私の結論は以下のとおりです。スキーマの構文解析をRELAXNG
として、実際のXMLライブラリを使用する必要があります
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を使用するいくつかのより多くを最適化している可能性がありますが、それは価値があるように見えるしませんでした)
それはすべてのsegfault'ed以来、私は、libxml-ruby
宝石から切り替えた後(Nokogiriで成功を収めてきましたWindowsのsegfaultの問題の一部が解決されたとchangelogが言っているが、v1.1.3との時間)。あなたが問題を抱えている場合installation tutorialを見て、鋸山をインストールし、
まずオフ:
はここで私が使用しているコードです。
gem install nokogiri
場合は、たとえば、「あなたの"Rails.root/config/enviroment.rb
に宝石を設定ファイル、Railsの上で実行されている:
はに基づいてXML文書を検証するにはちょうど逆に
config.gem 'nokogiri'
、require "nokogiri
場合はルビーを実行しています。あらかじめ定義されたRelaxNGスキーマ(ファイルは'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?
これが役に立ちます。
私のために非常によく働いた。 –
大きなXML文書のRelaxNG検証をしようとすると、libxml-ruby segfaultsがUbuntu上で非常に悲しいです。 – Valentin
試してみてください! :-) – cdleary