REXML :: Document.new把一个简单的字符串作为好的doc?

时间:2014-06-04 17:29:24

标签: ruby-on-rails ruby xml rexml

我想检查xml是否有效。所以,这是我的代码

require 'rexml/document'
begin

  def valid_xml?(xml)
    REXML::Document.new(xml)
  rescue REXML::ParseException
    return nil
  end

  bad_xml_2=%{aasdasdasd}
  if(valid_xml?(bad_xml_2) == nil)
    puts("bad xml")
    raise "bad xml"
  end
  puts("good_xml")
rescue Exception => e
  puts("exception" + e.message)
end

并返回good_xml作为结果。我做错什么了吗?如果字符串是

,它将返回bad_xml
bad_xml = %{
     <tasks>
      <pending>

      <entry>Grocery Shopping</entry>
      <done>
      <entry>Dry Cleaning</entry>
     </tasks>}

2 个答案:

答案 0 :(得分:1)

就个人而言,我建议使用Nokogiri,因为它是Ruby中XML / HTML解析的事实标准。使用它来解析格式错误的文档:

require 'nokogiri'

doc = Nokogiri::XML('<xml><foo><bar></xml>')
doc.errors # => [#<Nokogiri::XML::SyntaxError: Opening and ending tag mismatch: bar line 1 and xml>, #<Nokogiri::XML::SyntaxError: Premature end of data in tag foo line 1>, #<Nokogiri::XML::SyntaxError: Premature end of data in tag xml line 1>]

如果我解析格式正确的文档:

doc = Nokogiri::XML('<xml><foo/><bar/></xml>')
doc.errors # => []

答案 1 :(得分:0)

REXML将简单字符串视为没有根节点的有效XML:

xml = REXML::Document.new('aasdasdasd')
# => <UNDEFINED> ... </>

但是将非法XML(例如,使用不匹配的标记)视为有效的XML,并抛出异常。

REXML::Document.new(bad_xml)
# REXML::ParseException: #<REXML::ParseException: Missing end tag for 'done' (got "tasks")

它缺少<done>的结束标记 - 因此它无效。