问题
I'm creating an XML document: I want to unit test at least to make sure it's well-formed. So far, I have only been able to approximate this , by using the 'hasElements' in the REXML library.
Is there a better way ? Preferably using built-in libraries (I mean libraries that ship with the standard Ruby 1.8.x distro).
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);
回答1:
You can use Nokogiri. It's not a standard Ruby library, but you can easily install it as a 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
回答2:
I use LibXML to perform xml validations, here is the basic usage:
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
from LibXML::DTD
And this is a link to the LibXML documentation main page.
If you don't want to use your custom validation rules you can still use a public DTD with something like:
require 'open-uri'
dtd = LibXML::XML::Dtd.new(open("http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd").read)
of course you can do much better :)
回答3:
rexml
- build-in library. You can use a error handler to check your xml files
require 'rexml/document'
include REXML
errormsg = ''
doc = nil
begin
doc = Document.new(File.new(filename))
rescue
errormsg = $!
end
puts "Fail: #{errormsg}" if('' != errormsg)
来源:https://stackoverflow.com/questions/2012786/ruby-unit-test-is-this-a-valid-well-formed-xml-doc