Eh bien, j'ai un programme construit mais les résultats ne sont pas bons.
Mes conclusions sont les suivantes:
- rexml analyse syntaxique de schéma RelaxNG ne fonctionnera probablement pas. le code note qu'il est incomplet
- rexml analyse syntaxique de traction fonctionne probablement, mais difficile de dire
- les deux ci-dessus sont sans papiers
- 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)
+1 pour avoir essayé! :-) – cdleary