2012-12-27 18 views
6

मुझे आश्चर्य है कि रूबी में is_xml?(string) जैसे कोई फ़ंक्शन है या नहीं, यह निर्धारित करने के लिए कि कोई दिया गया स्ट्रिंग एक्सएमएल स्वरूपित है या नहीं।जांचें कि कोई स्ट्रिंग एक्सएमएल स्वरूपित है

+0

क्या आप एक्सएमएल और सही ढंग से एचटीएमएल के बीच अंतर करना चाहते हैं? –

+0

हाय टिन मैन, जवाब नहीं है। मेरे पास कुछ आम तार हैं और एक्सएमएल स्वरूपित तार एक साथ मिश्रित हैं। मैं उन्हें विभाजित करना चाहता हूं। – mCY

उत्तर

16

Nokogiri के parse अगर निर्धारित करने की कोशिश में एक सरल regex परीक्षण <html> की तलाश का उपयोग करता है

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

कुछ इसी तरह, XML घोषणा की तलाश में एक प्रारंभिक बिंदु होगा:: डेटा पार्स किया जा सकता HTML या XML है

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

यदि यह nil के अलावा कुछ भी लौटाता है तो स्ट्रिंग में एक्सएमएल घोषणा होती है। इसके लिए परीक्षण करना महत्वपूर्ण है क्योंकि एक खाली स्ट्रिंग अगले चरणों को मूर्ख बनाती है।

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 परीक्षण किया देखने के लिए अगर यह एक नियमित रूप से स्ट्रिंग बनाम सच एक्सएमएल के बीच का अंतर बता सकते हैं:

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

तो, आप अपनी फ़ाइलों के माध्यम से लूप और एक्सएमएल और गैर में उन्हें सॉर्ट कर सकते हैं

require 'nokogiri' 

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

एक चर के लिए group_by का परिणाम असाइन करें, और आप एक हैश आप गैर एक्सएमएल (false) या एक्सएमएल के लिए जाँच कर सकते हैं होगा (: आसानी से -XML)।

+0

महान क्या करना है! विवरण वास्तव में सहायक हैं। – mCY

+0

मैंने थोड़ा और कोड जोड़ा जो आपको उपयोगी लगेगा। –

1

वहाँ रूबी के स्ट्रिंग वर्ग या सक्रिय समर्थन की स्ट्रिंग एक्सटेंशन में ऐसी कोई समारोह है, लेकिन आप detect errors in XML को Nokogiri उपयोग कर सकते हैं:

begin 
    bad_doc = Nokogiri::XML(badly_formed) { |config| config.strict } 
rescue Nokogiri::XML::SyntaxError => e 
    puts "caught exception: #{e}" 
end 
+0

यह हमें बहुत कुछ नहीं बताता है: 'नोकोगिरी :: एक्सएमएल (' ') {| config | config.strict} => # <नोकोगिरी :: एक्सएमएल :: दस्तावेज़: 0x3fc9ba1c9a1c नाम = "दस्तावेज़"> '। एक खाली स्ट्रिंग एक्सएमएल नहीं है, न ही यह सही ढंग से या गलत रूप से स्वरूपित है। 'नोकोगिरी :: एक्सएमएल (' ')। त्रुटियां' आपको बताएंगी कि क्या त्रुटियां हैं, लेकिन अधिक स्पष्ट रूप से। –

+0

@theTinMan दाएं, लिंक में .errors उपयोग का एक उदाहरण भी है। 'bad_doc.errors' – nurettin

+0

आपके उत्तर के लिए धन्यवाद देता है। अब मुझे पता है कि ~ – mCY

संबंधित मुद्दे