Ruby单元测试:这是一个有效(格式良好)的XML Doc吗?

时间:2010-01-06 12:12:44

标签: xml ruby unit-testing rexml

我正在创建一个XML文档:我想至少进行单元测试,以确保它的格式正确。 到目前为止,我只能通过使用REXML库中的'hasElements'来估算它。

有更好的方法吗? 最好使用内置库(我的意思是随标准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);

3 个答案:

答案 0 :(得分:12)

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 :(得分: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)

当然你可以做得更好:)

答案 2 :(得分: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)