Хорошо, я построил программу, но результаты не очень хорошие.
Мои выводы следующие:
- синтаксический анализ rexml relaxng, вероятно, не работает. код отмечает, что он неполный
- синтаксический анализ rexml, вероятно, работает, но трудно сказать
- оба вышеперечисленных недокументированы
- вы должны использовать настоящую библиотеку XML, такую как libxml
Вот моя тестовая программа: 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, но это не показалось полезным)