is_xml?(string)
指定された文字列が XML 形式であるかどうかを識別するような関数が Ruby にあるかどうか疑問に思っています。
5828 次
2 に答える
20
Nokogiri'sでは、解析するデータが HTML か XML かを判断するparse
ために、次の単純な正規表現テストを使用しています。<html>
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>"]}
の結果を変数に割り当てると、非 XML ( ) または XML ( )group_by
をチェックできるハッシュが得られます。false
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 に答える