2009-05-27 13 views

risposta

6

Bene, ho creato un programma ma i risultati non sono buoni.

Le mie conclusioni sono le seguenti:

  1. rexml schema RelaxNG analisi probabilmente non funziona. il codice note è incompleto
  2. rexml tirare parsing probabilmente funziona, ma difficile dire
  3. sia di quanto sopra sono senza documenti
  4. si dovrebbe usare una libreria XML vero e proprio, come libxml

Ecco il mio programma di test : 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 

e ho fatto alcuni file XML giocattolo di esempio e file RNG e poi deciso di provarlo su OSX 10.5.x 012.(lunga linea spezzata per renderlo leggibile):

$ /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 

(ottengo lo stesso con 1.9)

Così, più o meno il fallimento.

(avrei potuto ottimizzato il programma di test un po 'di più per utilizzare add_listener ma non sembrava vale la pena)

+0

+1 per provare! :-) – cdleary

6

Ho avuto successo con Nokogiri (dopo il passaggio dal libxml-ruby gemma, dal momento che ogni segfault'ed tempo con v1.1.3, sebbene il changelog dica che alcuni problemi segfault di Windows sono stati risolti).

Ecco il codice che sto utilizzando:

Prima di tutto, installare Nokogiri, date un'occhiata alla installation tutorial se hai problemi.

gem install nokogiri 

Se l'esecuzione on Rails, config la gemma nella vostra "Rails.root/config/enviroment.rb", per esempio:.

config.gem 'nokogiri' 

Al contrario, proprio require "nokogiri se in esecuzione Rubino

per convalidare un documento XML sulla base di un schema RelaxNG predefinito (supponiamo che i file siano memorizzati in 'public'), utilizzare questo snippet:

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? 

Spero che questo aiuti!

+2

Ha funzionato molto bene per me. –

+1

segfaults libxml-ruby su Ubuntu quando si tenta di eseguire una convalida RelaxNG di un grande documento XML, molto triste. – Valentin