Rubyunit testing:这是一个有效(格式良好)的XML Doc吗?

我正在创建一个XML文档:我想至少进行unit testing,以确保它的格式良好。 到目前为止,我只能通过使用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); 

你可以使用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 

我使用LibXML来执行xmlvalidation,这里是基本用法:

 require 'libxml' # parse DTD dtd = LibXML::XML::Dtd.new(<  EOF # parse xml document to be validated instance = LibXML::XML::Document.file('instance.xml') # validate instance.validate(dtd) # => true | false 

来自LibXML :: DTD

这是LibXML文档主页的链接。

如果您不想使用自定义validation规则,您仍然可以使用以下内容的公共DTD:

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

当然你可以做得更好:)

rexml – 内置库。 您可以使用error handling程序检查xml文件

 require 'rexml/document' include REXML errormsg = '' doc = nil begin doc = Document.new(File.new(filename)) rescue errormsg = $! end puts "Fail: #{errormsg}" if('' != errormsg)