the*_*Man 18
Nokogiri parse
使用一个简单的正则表达式测试<html>
,试图确定要解析的数据是HTML还是XML:
string =~ /^s*<[^Hh>]*html/ # Probably html
Run Code Online (Sandbox Code Playgroud)
类似的东西,寻找XML声明将是一个起点:
string = '<?xml version="1.0"?><foo><bar></bar></foo>'
string.strip[/\A<\?xml/]
=> "<?xml"
Run Code Online (Sandbox Code Playgroud)
如果返回除nil
字符串以外的任何内容,则包含XML声明.测试这个很重要,因为空字符串会欺骗下一步.
Nokogiri::XML('').errors.empty?
=> true
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如果文档在语法上有效,则为true.
我刚刚测试了Nokogiri,看看它是否可以区分常规字符串与真正的XML:
[2] (pry) main: 0> doc = Nokogiri::XML('foo').errors
[
[0] #<Nokogiri::XML::SyntaxError: Start tag expected, '<' not found>
]
Run Code Online (Sandbox Code Playgroud)
因此,您可以循环遍历文件并轻松地将它们分类为XML和非XML:
require 'nokogiri'
[
'',
'foo',
'<xml></xml>'
].group_by{ |s| (s.strip > '') && Nokogiri::XML(s).errors.empty? }
=> {false=>["", "foo"], true=>["<xml></xml>"]}
Run Code Online (Sandbox Code Playgroud)
将结果分配group_by
给变量,并且您将拥有可以检查非XML(false
)或XML(true
)的哈希.