我正在创建一个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);
答案 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 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)