Модуль REXML
, похоже, поддерживает RELAX NG validation, но в документации нет реальной информации об использовании валидационной части фреймворка.
Как бы вы проверили XML-документ с помощью схемы RELAX NG? Фрагмент кода был бы наиболее полезным. TIA!
2 ответа
Ну, у меня есть программа, но результаты не очень хороши.
Мои выводы таковы:
- синтаксический анализ схемы rexml relaxng, вероятно, не работает. код отмечает, что он неполный
- rexml pull parsing, вероятно, работает, но трудно сказать
- оба вышеперечисленного недокументированы
- вы должны использовать настоящую библиотеку 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, но это не казалось целесообразным)
Я добился успеха с 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?
Надеюсь это поможет !
Похожие вопросы
Новые вопросы
xml
XML (Extensible Markup Language) - это формат структурированного документа, определяющий правила кодирования текста. При использовании этого тега включайте дополнительные теги, такие как язык программирования, наборы инструментов, используемые технологии XML и другие теги, описывающие среду, в которой опубликована проблема. Гибкость XML обеспечивает широкий спектр применений для передачи человеческих и машинных данных, в том числе конкретных инструментов и библиотек.