2010-01-06 4 views
5

XML 문서를 만듭니다. 최소한 단위 테스트를 통해 올바른 형식인지 확인하고 싶습니다. 지금까지 REXML 라이브러리에서 'hasElements'를 사용하여이를 근사시킬 수있었습니다.Ruby Unit Test : 유효한 (잘 구성된) XML 문서입니까?

더 좋은 방법이 있습니까? 기본 제공 라이브러리를 사용하는 것이 좋습니다 (표준 Ruby 1.8.x 배포판과 함께 제공되는 라이브러리를 의미 함). 내가 XML 검증을 수행 할 수 LibXML을 사용

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을 훨씬 더 잘 할 수 물론

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

. 표준 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보다 nokogiri를 선호하기 때문이다. (Uela 'Simone :)) – makevoid

+0

고마워 - +1 - 나는 이것을 줄 수도 있지만이 시점에서 다른 보석을 설치하지 않도록하고 싶다! – monojohnny

+0

안녕하세요, Ciao Francesco! –

2

, 여기에 기본적인 사용법이다 :

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를 사용하여 사용자 정의 유효성 검사 규칙을 사용하지 않는 경우 : 당신이 :)

+0

감사를 확인하기 위해 오류 처리기를 사용할 수 있습니다 - 실제로 아직 DTD가없는 - - 그 체크 아웃하지만 어쩌면 내가 실제로 하나를 작성해야 .... 나는 경우 볼 수 있습니다 그것은 또한 단순한 'well-formedness'체크를합니다. – 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) 
관련 문제