Модульный тест Ruby: действительно ли это - Действительный (правильно построенный) Документ XML?

Я создаю XML-документ: Я хочу к модульному тесту, по крайней мере, удостовериться, что это правильно построено. До сих пор я только смог приблизить это, при помощи 'hasElements' в библиотеке REXML.

Существует ли лучший путь? Предпочтительно пользуясь встроенными библиотеками (я имею в виду библиотеки, которые поставлются со стандартным 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);
6
задан Jon Seigel 2 February 2010 в 15:34
поделиться

2 ответа

Вы можете использовать Нокогири . Это не стандартная библиотека 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
12
ответ дан 8 December 2019 в 17:21
поделиться

Я использую 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-документации.

Если вы не хотите использовать свои пользовательские правила проверки, вы все равно можете использовать публичный DTD с чем-то вроде:

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

Конечно, вы можете сделать гораздо лучше :)

.
2
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: