2010-01-06 2 views
5

Я создаю XML-документ: я хочу, чтобы по крайней мере, чтобы проверить, что он хорошо сформирован. До сих пор я мог только приблизиться к этому, используя «hasElements» в библиотеке REXML.Ruby Unit Test: Является ли это корректным (хорошо сформированным) XML-документом?

Есть ли лучший способ? Предпочтительно использовать встроенные библиотеки (я имею в виду библиотеки, которые поставляются со стандартным дистрибутивом Ruby 1.8.x).

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); 

ответ

11

You can use Nokogiri. Это не стандартная библиотека Ruby, но вы можете легко установить ее как Gem.

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, потому что я предпочитаю нокогири над libxml тоже. (Uela 'Simone :)) – makevoid

+0

Спасибо - +1 - я мог бы отдать это, но я хочу избежать установки каких-либо других драгоценных камней на этом этапе! – monojohnny

+0

Эй, цзяо Франческо! –

2

Я использую LibXML для выполнения XML валидаций, здесь является основным использование:

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 

из LibXML::DTD

И это ссылка на главную страницу LibXML documentation.

Если вы не хотите использовать пользовательские правила проверки вы можете использовать общедоступный DTD что-то вроде:

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

, конечно, вы можете сделать гораздо лучше :)

+0

Спасибо - проверим, что нет - на самом деле у меня нет DTD - но, возможно, я должен написать его ... Я посмотрю, если он также выполняет простую проверку «правильной формы». – monojohnny

0

rexml - встроенная библиотека. Вы можете использовать обработчик ошибок, чтобы проверить ваши файлы xml.

require 'rexml/document' 
include REXML 

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

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