我想知道 Ruby 中是否有一个函数is_xml?(string)
可以识别给定的字符串是否为 XML 格式。
问问题
5828 次
2 回答
20
Nokogiriparse
使用一个简单的正则表达式测试来<html>
尝试确定要解析的数据是 HTML 还是 XML:
string =~ /^s*<[^Hh>]*html/ # Probably html
类似的东西,寻找 XML 声明将是一个起点:
string = '<?xml version="1.0"?><foo><bar></bar></foo>'
string.strip[/\A<\?xml/]
=> "<?xml"
nil
如果返回的字符串以外的任何内容都包含 XML 声明。对此进行测试很重要,因为空字符串会欺骗后续步骤。
Nokogiri::XML('').errors.empty?
=> true
Nokogiri 也有这个errors
方法,它会在尝试解析格式错误的文档后返回一系列错误。测试任何尺寸都会有所帮助:
Nokogiri::XML('<foo>').errors
=> [#<Nokogiri::XML::SyntaxError: Premature end of data in tag foo line 1>]
Nokogiri::XML('<foo>').errors.empty?
=> false
Nokogiri::XML(string).errors.empty?
=> true
如果文档在语法上有效,则为 true。
我刚刚测试了 Nokogiri,看看它是否可以区分常规字符串和真正的 XML:
[2] (pry) main: 0> doc = Nokogiri::XML('foo').errors
[
[0] #<Nokogiri::XML::SyntaxError: Start tag expected, '<' not found>
]
因此,您可以遍历文件并将它们轻松分类为 XML 和非 XML:
require 'nokogiri'
[
'',
'foo',
'<xml></xml>'
].group_by{ |s| (s.strip > '') && Nokogiri::XML(s).errors.empty? }
=> {false=>["", "foo"], true=>["<xml></xml>"]}
将结果分配group_by
给一个变量,您将获得一个哈希值,您可以检查非 XML ( false
) 或 XML ( true
)。
于 2012-12-27T09:53:17.550 回答
1
Ruby 的 String 类或 Active Support 的 String 扩展中没有这样的功能,但您可以使用 Nokogiri 来检测 XML 中的错误:
begin
bad_doc = Nokogiri::XML(badly_formed) { |config| config.strict }
rescue Nokogiri::XML::SyntaxError => e
puts "caught exception: #{e}"
end
于 2012-12-27T09:11:46.593 回答