我想检查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_xmlbad_xml = %{
<tasks>
<pending>
<entry>Grocery Shopping</entry>
<done>
<entry>Dry Cleaning</entry>
</tasks>}
答案 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>
的结束标记 - 因此它无效。