2010-01-06 18 views
5

Sto creando un documento XML: voglio test dell'unità almeno per accertarmi che sia ben formato. Finora, sono stato in grado di approssimare questo, usando "hasElements" nella libreria REXML.Test unità rubino: si tratta di un documento XML valido (ben formato)?

C'è un modo migliore? Preferibilmente utilizzando le librerie incorporate (intendo librerie fornite con la distro Ruby 1.8.x standard).

require "test/unit" 
require 'rexml/document' 
require 'test/unit/ui/console/testrunner' 

include REXML 

class TestBasic < Test::Unit::TestCase 

    def test_createXML 
    my_xml=...create doc here... 
    doc = Document.new(my_xml); 
    assert(doc.has_elements?); 
    end 

end 

Test::Unit::UI::Console::TestRunner.run(TestBasic); 

risposta

11

You can use Nokogiri. Non è una libreria standard di Ruby, ma puoi facilmente installarla come gemma.

begin 
    bad_doc = Nokogiri::XML(badly_formed) { |config| config.options = Nokogiri::XML::ParseOptions::STRICT } 
rescue Nokogiri::XML::SyntaxError => e 
    puts "caught exception: #{e}" 
end 
# => caught exception: Premature end of data in tag root line 1 
+1

+1 perché preferisco nokogiri anche su libxml. (Uela 'Simone :)) – makevoid

+0

Grazie - +1 - Potrei dare una possibilità, ma voglio evitare di installare altre gemme a questo punto! – monojohnny

+0

Ehi, ciao Francesco! –

2

Io uso LibXML per eseguire convalide xml, qui è l'uso di base:

require 'libxml' 

# parse DTD 
dtd = LibXML::XML::Dtd.new(<<EOF) 
<!ELEMENT root (item*) > 
<!ELEMENT item (#PCDATA) > 
EOF 

# parse xml document to be validated 
instance = LibXML::XML::Document.file('instance.xml') 

# validate 
instance.validate(dtd) # => true | false 

da LibXML::DTD

e questo è un link alla pagina principale LibXML documentation.

Se non si desidera utilizzare le regole di convalida personalizzati è comunque possibile utilizzare una DTD pubblica con qualcosa di simile:

require 'open-uri' 
dtd = LibXML::XML::Dtd.new(open("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd").read) 

, naturalmente, si può fare molto meglio :)

+0

Grazie - sarà verificare che fuori - Io in realtà non ho ancora un DTD - ma forse avrei dovuto effettivamente scrivere uno .... vedrò se fa anche un semplice controllo "ben formato". – monojohnny

0

rexml - libreria incorporata. È possibile utilizzare un gestore degli errori per controllare i file XML

require 'rexml/document' 
include REXML 

errormsg = '' 
doc = nil 
begin 
    doc = Document.new(File.new(filename)) 
rescue 
    errormsg = $! 
end 

puts "Fail: #{errormsg}" if('' != errormsg) 
Problemi correlati