2009-05-27 4 views

Trả lời

6

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:

  1. rexml schema RelaxNG phân tích cú pháp có thể không hoạt động. mã lưu ý đó là không đầy đủ
  2. rexml kéo phân tích cú pháp có thể hoạt động nhưng khó có thể nói
  3. cả những điều trên không có giấy tờ
  4. 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á)

+0

+1 để thử! :-) – cdleary

6

Tôi đã thành công với Nokogiri (sau khi chuyển từ các libxml-ruby đá quý, vì nó segfault'ed mỗi thời gian với v1.1.3, mặc dù changelog nói rằng một số vấn đề segfault Windows đã được giải quyết).

Dưới đây là đoạn code tôi đang sử dụng:

Trước hết, cài đặt Nokogiri, hãy nhìn vào các installation tutorial nếu bạn đang gặp vấn đề.

gem install nokogiri 

Nếu chạy on Rails, cấu hình các viên ngọc trong "Rails.root/config/enviroment.rb của bạn", ví dụ:.

config.gem 'nokogiri' 

Ngược lại, chỉ cần require "nokogiri nếu chạy của Ruby

Để xác nhận một tài liệu XML dựa trên một lược đồ RelaxNG được xác định trước (chúng tôi sẽ giả định các tệp được lưu trữ trong 'public'), sử dụng đoạn mã sau:

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? 

Hy vọng điều này sẽ hữu ích!

+2

Làm việc rất tốt cho tôi. –

+1

libxml-ruby segfaults trên Ubuntu khi cố gắng thực hiện xác nhận RelaxNG của một tài liệu XML lớn, rất buồn. – Valentin