2009-11-20 33 views
8

Tôi đang tạo ra nhiều đoạn mã XMPP và muốn xác thực chúng theo các thông số kỹ thuật có sẵn here trong các thử nghiệm đơn vị của tôi.Xác nhận hợp lệ XML bằng cách sử dụng nhiều XSD trong Ruby

Hiện nay tôi đang sử dụng Nokogiri để đạt được điều này với một cái gì đó giống như

xml = Nokogiri::XML(xmpp_stanza) 
schema = Nokogiri::XML::Schema(xmpp_schema) 

assert schema.valid?(xml) 

Bây giờ làm việc này tốt, ngoại trừ nó được báo cáo là không hợp lệ vì mỗi giản đồ chỉ bao gồm một không gian tên, và các khổ thơ XMPP tôi có nhiều không gian tên. Ví dụ:

Invalid XML: Element '{http://jabber.org/protocol/pubsub}pubsub': No matching global element declaration available, but demanded by the strict wildcard. 

Tôi có ý định xử lý nhiều lược đồ để xác thực một đoạn đơn? Tôi có nghĩa là để đầu tiên chia nó ra bởi không gian tên và xác nhận mỗi một trong sự cô lập?

Trả lời

1

Tôi có thể đạt được điều này bằng cách importing một giản đồ này sang lược đồ khác.

ví dụ:

<xs:import namespace="http://base.google.com/ns/1.0" schemaLocation="public/xsd/google_base.xsd"/> 
0

Nếu bạn không có không gian tên khác có sẵn, bạn cũng có thể làm thay đổi schema để bao gồm một processContents = "lỏng lẻo" chỉ thị trên có liên quan "bất kỳ" nút trong lược đồ, nói rằng nó là okay KHÔNG để xác thực các không gian tên mà bạn không có lược đồ. Tôi đã làm như vậy:

schema_xml  = Nokogiri::XML(File.read(path)) 
schema_xml.xpath("//xs:any[@namespace='##other']", 
    {"xs" => "http://www.w3.org/2001/XMLSchema"}).each do |node| 
    node["processContents"] = "lax" 
end 
schema = Nokogiri::XML::Schema.from_document(schema_xml) 

Tất nhiên, điều này có nghĩa là không gian tên bên ngoài sẽ không được xác thực.

Các vấn đề liên quan