2009-11-20 22 views
8

Estoy generando muchas standas XMPP, y quiero validarlas con las especificaciones disponibles here en mis pruebas unitarias.Validar XML usando múltiples XSD en Ruby

Por el momento estoy usando Nokogiri para lograr esto con algo como

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

assert schema.valid?(xml) 

Ahora bien, esto funciona bien, excepto que se considera no válido debido a que cada esquema sólo cubre un espacio de nombres, y mis estrofas XMPP tener múltiples espacios de nombres. Por ejemplo:

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

¿Cómo debo manejar varios esquemas para validar una sola estrofa? ¿Debo dividirlo primero por espacio de nombres y validar cada uno de forma aislada?

Respuesta

1

Pude lograr esto por importing un esquema en el otro.

p. Ej.

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

Si usted no tiene los otros espacios de nombres disponibles, también puede ser capaz de alterar el esquema para incluir un processContents = directiva "laxa" en "cualquier" nodos relevantes en el esquema, diciendo que está bien NO para validar espacios de nombres para los que no tienes un esquema. Me gustó:

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) 

Por supuesto, esto significa que los espacios de nombres externos no serán validados.

Cuestiones relacionadas