2012-12-27 35 views
6

Tôi tự hỏi liệu có một hàm trong Ruby như is_xml?(string) để xác định xem chuỗi đã định dạng XML hay không.Kiểm tra xem chuỗi có được định dạng XML

+0

Bạn có muốn phân biệt giữa XML và HTML được định dạng đúng không? –

+0

Hi Tin Man, câu trả lời là không. Tôi có một số chuỗi phổ biến và chuỗi định dạng XML được trộn lẫn với nhau. Tôi muốn chia chúng. – mCY

Trả lời

16

Nokogiri của parse sử dụng một thử nghiệm regex đơn giản tìm kiếm <html> trong một nỗ lực để xác định xem dữ liệu được phân tích cú pháp là HTML hay XML:

string =~ /^s*<[^Hh>]*html/ # Probably html 

Something tương tự, tìm kiếm các khai báo XML sẽ là một điểm khởi đầu:

string = '<?xml version="1.0"?><foo><bar></bar></foo>' 
string.strip[/\A<\?xml/] 
=> "<?xml" 

Nếu điều đó trả về bất kỳ điều gì khác ngoài nil thì chuỗi chứa khai báo XML. Điều quan trọng là phải kiểm tra điều này vì một chuỗi rỗng sẽ đánh lừa các bước tiếp theo.

Nokogiri::XML('').errors.empty? 
=> true 

Nokogiri cũng có phương pháp errors, mà sẽ trả về một mảng các lỗi sau khi cố gắng phân tích một tài liệu bị thay đổi. Thử nghiệm cho mọi kích thước sẽ giúp:

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 

sẽ đúng nếu tài liệu có giá trị về mặt cú pháp.


tôi chỉ thử nghiệm Nokogiri để xem nếu nó có thể biết sự khác biệt giữa một chuỗi thường xuyên vs đúng XML:

[2] (pry) main: 0> doc = Nokogiri::XML('foo').errors 
[ 
    [0] #<Nokogiri::XML::SyntaxError: Start tag expected, '<' not found> 
] 

Vì vậy, bạn lặp qua tập tin của bạn và có thể sắp xếp chúng thành XML và phi -xml dễ dàng:

require 'nokogiri' 

[ 
    '', 
    'foo', 
    '<xml></xml>' 
].group_by{ |s| (s.strip > '') && Nokogiri::XML(s).errors.empty? } 
=> {false=>["", "foo"], true=>["<xml></xml>"]} 

Gán kết quả của group_by cho một biến, và bạn sẽ có một hash bạn có thể kiểm tra các phi XML (false) hoặc XML (true).

+0

Tuyệt vời! Các chi tiết thực sự hữu ích. – mCY

+0

Tôi đã thêm một chút mã bạn có thể thấy hữu ích. –

1

Không có chức năng như vậy trong lớp String Ruby hoặc mở rộng chuỗi tích cực hỗ trợ, nhưng bạn có thể sử dụng 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

Điều này không cho chúng ta biết nhiều: 'Nokogiri :: XML ('') {| config | config.strict} => # '. Một chuỗi rỗng không phải là XML, cũng không phải là định dạng chính xác hoặc không chính xác. 'Nokogiri :: XML (''). Errors' sẽ cho bạn biết nếu có lỗi, nhưng rõ ràng hơn. –

+0

@theTinMan đúng, liên kết có một ví dụ về việc sử dụng .errors là tốt. 'đặt bad_doc.errors' – nurettin

+0

Cảm ơn câu trả lời của bạn. Bây giờ tôi biết phải làm gì ~ – mCY

Các vấn đề liên quan