2012-12-27 104 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

相關問題