Как проверить XML через RELAX NG в Ruby?

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

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


person cdleary    schedule 27.05.2009    source источник


Ответы (2)


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

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

  1. Разбор схемы rexml Relaxng, вероятно, не работает. код отмечает, что он неполный
  2. Разбор rexml pull, вероятно, работает, но трудно сказать
  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, но это не стоило того)

person dajobe    schedule 01.06.2009

У меня был успех с Nokogiri (после перехода с libxml-ruby драгоценного камня, так как он каждый раз segfault с 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?

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

person Dr1Ku    schedule 25.03.2010
comment
libxml-ruby segfaults в Ubuntu при попытке выполнить проверку RelaxNG большого XML-документа, что очень печально. - person Valentin V; 24.09.2012