0

我想检查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>}
4

2 回答 2

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 # => []
于 2014-06-04T20:55:45.640 回答
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>- 所以它是无效的。

于 2014-06-04T17:39:22.683 回答