检查字符串是否为XML格式

时间:2012-12-27 09:03:12

标签: ruby xml string

我想知道Ruby中是否有像is_xml?(string)这样的函数来识别给定字符串是否是XML格式的。

2 个答案:

答案 0 :(得分:17)

Nokogiri的parse使用简单的正则表达式测试来查找<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
如果文档在语法上有效,则

将为真。


我刚刚测试了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)。

答案 1 :(得分:1)

Ruby的String类或Active Support的String扩展中没有这样的函数,但你可以使用Nokogiri detect errors in XML

begin
  bad_doc = Nokogiri::XML(badly_formed) { |config| config.strict }
rescue Nokogiri::XML::SyntaxError => e
  puts "caught exception: #{e}"
end