【问题标题】:Ruby Unit Test : Is this a Valid (well-formed) XML Doc?Ruby 单元测试:这是一个有效的(格式良好的)XML 文档吗?
【发布时间】:2010-01-06 12:12:44
【问题描述】:

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

【问题讨论】:

    标签: xml ruby unit-testing rexml


    【解决方案1】:

    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 因为我也更喜欢 nokogiri 而不是 libxml。 (Uela'西蒙娜:))
    • 谢谢 - +1 - 我可能会试一试,但此时我想避免安装任何其他 gem!
    • 还没有尝试过,但它看起来是这里最合适的答案。 [尽管必须安装另一个 gem - 但有时你必须这样做!] 谢谢。
    【解决方案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)
    

    当然你可以做得更好:)

    【讨论】:

    • 谢谢 - 会检查一下 - 我实际上还没有 DTD - 但也许我应该写一个....我会看看它是否有一个简单的“格式良好”也检查一下。
    【解决方案3】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2013-12-13
      • 2010-09-13
      • 1970-01-01
      • 2010-11-25
      • 2014-12-20
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多