2010-01-06 32 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) 
相關問題