2012-12-27 105 views
6

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

+0

你想区分XML和正确形成的HTML吗? –

+0

嗨田满,答案是否定的。我有一些常见的字符串和XML格式的字符串混合在一起。我想分裂他们。 – mCY

回答

16

引入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)。

+0

太棒了!细节真的很有帮助。 – mCY

+0

我加了一点你可能会觉得有用的代码。 –

1

有一个在Ruby的String类或Active支持的字符串扩展没有这样的功能,但可以使用引入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 
+0

这并没有告诉我们多少:'Nokogiri :: XML(''){| config | config.strict} =>#'。一个空字符串不是XML,也不是正确或不正确的格式。 'Nokogiri :: XML('')。errors'会告诉你是否有错误,但更清楚。 –

+0

@theTinMan的权利,链接也有一个.errors用法的例子。 'puts bad_doc.errors' – nurettin

+0

感谢您的回答。现在我知道该怎么做〜 – mCY

相关问题