2010-01-06 34 views
5

我正在创建一个XML文档:我想单元测试,至少要确保它是格式良好的。 到目前为止,我只能通过使用REXML库中的'hasElements'来近似这一点。Ruby单元测试:这是一个有效(格式良好)的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库,但你可以很容易地将它安装为一个宝石。

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,因为我更喜欢nokogiri而不是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) 
相关问题