Модуль REXML, похоже, поддерживает RELAX NG validation, но в документации нет реальной информации об использовании валидационной части фреймворка.

Как бы вы проверили XML-документ с помощью схемы RELAX NG? Фрагмент кода был бы наиболее полезным. TIA!

7
cdleary 27 Май 2009 в 04:51

2 ответа

Лучший ответ

Ну, у меня есть программа, но результаты не очень хороши.

Мои выводы таковы:

  1. синтаксический анализ схемы rexml relaxng, вероятно, не работает. код отмечает, что он неполный
  2. rexml pull parsing, вероятно, работает, но трудно сказать
  3. оба вышеперечисленного недокументированы
  4. вы должны использовать настоящую библиотеку 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, но это не казалось целесообразным)

6
dajobe 1 Июн 2009 в 07:43

Я добился успеха с Nokogiri (после перехода с драгоценного камня libxml-ruby, так как он каждый раз segfault'ed с v1.1.3, хотя в журнале изменений говорится, что некоторые проблемы с ошибкой Windows были решены).

Вот код, который я использую:

Во-первых, установите Nokogiri, ознакомьтесь с руководством по установке, если у вас возникли проблемы.

gem install nokogiri

Если вы работаете на Rails, настройте гем в "Rails.root/config/enviroment.rb ", например:

config.gem 'nokogiri'

И наоборот, просто require "nokogiri, если запущен Ruby.

Чтобы проверить XML-документ на основе предопределенной схемы 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?

Надеюсь это поможет !

6
Dr1Ku 10 Апр 2013 в 18:11
1
Ошибка libxml-ruby на Ubuntu при попытке выполнить RelaxNG-валидацию большого XML-документа, очень печально.
 – 
Valentin V
24 Сен 2012 в 14:15