2009-05-27 12 views

Répondre

6

Eh bien, j'ai un programme construit mais les résultats ne sont pas bons.

Mes conclusions sont les suivantes:

  1. rexml analyse syntaxique de schéma RelaxNG ne fonctionnera probablement pas. le code note qu'il est incomplet
  2. rexml analyse syntaxique de traction fonctionne probablement, mais difficile de dire
  3. les deux ci-dessus sont sans papiers
  4. vous devez utiliser une vraie bibliothèque XML tels que libxml

Voici mon programme de 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 

et je fait quelques fichiers XML par exemple des jouets et des fichiers RNG et ai essayé sur Mac OS X 10.5.x (longue ligne brisée pour le rendre lisible):

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

(je reçois la même chose avec 1,9)

Donc, à peu près l'échec.

(je aurais pu optimiser le programme de test un peu plus à utiliser add_listener mais il ne semble pas utile)

+0

+1 pour avoir essayé! :-) – cdleary

6

J'ai eu du succès avec Nokogiri (après le passage de la pierre précieuse libxml-ruby, car il segfault'ed tous les time with v1.1.3, bien que le changelog indique que certains problèmes de segfault Windows ont été résolus).

Voici le code que je utilise:

Tout d'abord, installez Nokogiri, jetez un oeil à la installation tutorial si vous rencontrez des problèmes.

gem install nokogiri 

Si sur des rails, config la pierre précieuse dans votre "Rails.root/config/enviroment.rb », par exemple:.

config.gem 'nokogiri' 

A l'inverse, juste require "nokogiri si vous utilisez Ruby

Pour valider un document XML basé sur une schéma RelaxNG prédéfini (nous supposerons que les fichiers sont stockés dans 'public'), utilisez cet extrait:

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? 

Espérons que cela aide!

+2

A travaillé très bien pour moi. –

+1

libxml-ruby segfaults sur Ubuntu en essayant de faire une validation RelaxNG d'un gros document XML, très triste. – Valentin