2009-05-27 7 views

答えて

6

私はプログラムを構築しましたが、結果は良くありません。次のように

私の結論は以下のとおりです。スキーマの構文解析をRELAXNG

  1. REXMLはおそらく動作しません。コードノート、それは不完全
  2. REXMLプル解析は、おそらく上記の両方を使用すると、の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を使用するいくつかのより多くを最適化している可能性がありますが、それは価値があるように見えるしませんでした)

  • +0

    試してみてください! :-) – cdleary

    6

    それはすべての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? 
    

    これが役に立ちます。

    +2

    私のために非常によく働いた。 –

    +1

    大きなXML文書のRelaxNG検証をしようとすると、libxml-ruby segfaultsがUbuntu上で非常に悲しいです。 – Valentin

    関連する問題