Vâng, tôi đã xây dựng chương trình nhưng kết quả không tốt.
kết luận của tôi là như sau:
- rexml schema RelaxNG phân tích cú pháp có thể không hoạt động. mã lưu ý đó là không đầy đủ
- rexml kéo phân tích cú pháp có thể hoạt động nhưng khó có thể nói
- cả những điều trên không có giấy tờ
- bạn nên sử dụng một thư viện XML thực như libxml
Dưới đây là chương trình thử nghiệm của tôi : 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
và tôi thực hiện một số file XML ví dụ đồ chơi và các tập tin RNG và sau đó thử nó ra trên OSX 10.5.x 012.(dòng dài bị phá vỡ để làm cho nó có thể đọc được):
$ /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
(tôi nhận được cùng với 1,9)
Vì vậy, khá nhiều thất bại.
(tôi có thể tối ưu hóa các chương trình thử nghiệm một số chi tiết để sử dụng add_listener nhưng nó không có vẻ đáng giá)
+1 để thử! :-) – cdleary