2009-05-27 11 views

Respuesta

6

Bueno, tengo un programa construido pero los resultados no son buenos.

Mis conclusiones son las siguientes:

  1. rexml esquema relaxng análisis probablemente no funciona. el código señala que es incompleta
  2. análisis tirón rexml probablemente funciona, pero difícil de decir
  3. tanto de lo anterior son indocumentados
  4. se debe utilizar una librería XML real, como libxml

Aquí es mi programa de prueba : 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 

y he hecho algunos archivos XML ejemplo de juguete y archivos RNG y luego probé en OSX 10.5.x (línea larga roto para que sea legible):

$ /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 

(me sale lo mismo con 1,9)

Así, más o menos fracaso.

(I podrían haber optimizado el programa de pruebas un poco más para utilizar add_listener pero no pareció que vale la pena)

+0

+1 por intentar! :-) – cdleary

6

que he tenido éxito con Nokogiri (después de la conexión de la libxml-ruby joya, ya que cada segfault'ed tiempo con v1.1.3, aunque el registro de cambios indica que algunos problemas de segfault de Windows se han resuelto).

Aquí está el código que estoy usando:

En primer lugar, instale Nokogiri, echar un vistazo a la installation tutorial si usted está teniendo problemas.

gem install nokogiri 

Si utiliza una vía férrea, config la gema en su "Rails.root/config/enviroment.rb", por ejemplo:.

config.gem 'nokogiri' 

Por el contrario, simplemente require "nokogiri si se ejecuta Rubí

Para validar un documento XML basado en una esquema RelaxNG predefinido (supondremos que los archivos están almacenados en 'public'), use este fragmento:

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? 

Espero que esto ayude!

+2

Funcionó muy bien para mí. –

+1

libxml-ruby segfaults en Ubuntu al intentar hacer una validación RelaxNG de un gran documento XML, muy triste. – Valentin

Cuestiones relacionadas