2009-05-27 4 views
7

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

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

ответ

6

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

Мои выводы заключаются в следующем:

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

+0

+1 для попытки! :-) – cdleary

6

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

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

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

gem install nokogiri 

При работе на Rails, конфиг драгоценный камень в вашем "Rails.root/config/enviroment.rb», например:.

config.gem 'nokogiri' 

И наоборот, только require "nokogiri если рубинового

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

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

+2

Работал очень хорошо для меня. –

+1

libxml-ruby segfaults на Ubuntu при попытке сделать проверку RelaxNG большого XML-документа очень печальным. – Valentin

 Смежные вопросы

  • Нет связанных вопросов^_^