एक्सकोड में एक्सएमएल फाइलों को कैसे पार्स करें

एक सरल कार्य जो कई ऐप्स के लिए रीढ़ की हड्डी है एक्सएमएल फाइलों को पार्स करने की क्षमता है। और, सौभाग्य से, एक्सकोड उद्देश्य-सी में एक एक्सएमएल फ़ाइल को पार्स करना अपेक्षाकृत आसान बनाता है।

एक एक्सएमएल फ़ाइल में आपके ऐप के बारे में मूल डेटा से किसी वेबसाइट के लिए आरएसएस फ़ीड में कुछ भी शामिल हो सकता है। वे आपके ऐप के भीतर दूरस्थ रूप से जानकारी अपडेट करने का एक शानदार तरीका भी हो सकते हैं, इस प्रकार एक सूची में एक नया आइटम जोड़ने के लिए ऐप्पल को एक नई बाइनरी जमा करने की आवश्यकता को छोड़कर।

तो हम एक्सकोड फाइलों को एक्सकोड में कैसे संसाधित करते हैं? प्रक्रिया में एक्सएमएल पार्सर प्रक्रिया शुरू करने, एक फाइल को संसाधित करने, व्यक्तिगत तत्व की शुरुआत, तत्व के भीतर वर्ण (मूल्य) को शुरू करने के लिए चर का उपयोग करने के लिए चरण शामिल हैं, एक व्यक्तिगत तत्व का अंत, और पार्सिंग प्रक्रिया के अंत।

इस उदाहरण में, हम इसे एक विशेष वेब पता ( यूआरएल ) पास करके इंटरनेट से फाइल को पार्स कर देंगे।

हम हेडर फ़ाइल बनाने के साथ शुरू करेंगे। यह हमारी फ़ाइल को पार्स करने के लिए न्यूनतम आवश्यकताओं के साथ एक विस्तृत दृश्य नियंत्रक के लिए एक बहुत ही बुनियादी शीर्षलेख फ़ाइल का एक उदाहरण है:

@interface रूट दृश्य नियंत्रक: UITableViewController {
DetailViewController * विस्तार दृश्य नियंत्रक;

एनएसएक्सएमएल पार्सर * आरएसएसपीसर;
एनएसएमयूटेबलएरे * लेख;
एनएसएमयूटेबल डिक्शनरी * आइटम;
एनएसएसटींग * वर्तमान एलिमेंट;
NSMutableString * ElementValue;
बूल त्रुटि विश्लेषण;
}

@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;

- (शून्य) parseXMLFileAtURL: (एनएसएसटींग *) यूआरएल;

ParseXMLFileAtURL फ़ंक्शन हमारे लिए प्रक्रिया शुरू करेगा। जब यह खत्म हो जाता है, तो एनएसएमयूटेबलएरे "लेख" हमारे डेटा को पकड़ेंगे। सरणी एक्सएमएल फ़ाइल में फ़ील्ड नाम से संबंधित कुंजी के साथ परिवर्तनीय शब्दकोशों से बना होगी।

अब जब हमने आवश्यक चर सेट अप किए हैं, तो हम .m फ़ाइल में प्रक्रिया की पूर्ति पर आगे बढ़ेंगे:

- (शून्य) पार्सरडिस्ट स्टार्ट डॉक्यूमेंट: (एनएसएक्सएमएल पार्सर *) पार्सर {
एनएसएलओजी (@ "फ़ाइल मिली और पार्सिंग शुरू हुई");

}

यह फ़ंक्शन प्रक्रिया की शुरुआत में चलता है। इस फ़ंक्शन में कुछ भी डालने की आवश्यकता नहीं है, लेकिन यदि आप फ़ाइल को पार्स करना शुरू करते हैं तो एक कार्य करना चाहते हैं, यह वह जगह है जहां आप अपना कोड डाल देंगे।

- (शून्य) parseXMLFileAtURL: (एनएसएसटींग *) यूआरएल
{

एनएसएसटींग * एजेंटस्ट्रिंग = @ "मोज़िला / 5.0 (मैकिंटोश; यू; इंटेल मैक ओएस एक्स 10_5_6; एन-यूएस) ऐप्पलवेबकिट / 525.27.1 (केएचटीएम, जैसे गेको) संस्करण / 3.2.1 सफारी / 525.27.1";
NSMutableURLRequest * अनुरोध = [NSMutableURLRequest अनुरोध WithURL:
[NSURL URLWithString: URL]];
[अनुरोध setValue :HTTPHeaderField के लिए एजेंटस्ट्रिंग: @ "उपयोगकर्ता-एजेंट"];
xmlFile = [NSURLConnection sendSynchronousRequest: अनुरोध लौटने का अनुरोध प्रतिक्रिया: शून्य त्रुटि: शून्य];


लेख = [[एनएसएमयूटेबलएरे ऑलोक] init];
errorParsing = नहीं;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[आरएसएसपार्सर सेट डिलीगेट: स्वयं];

// आपको इनमें से कुछ को उस XML फ़ाइल के प्रकार के आधार पर चालू करने की आवश्यकता हो सकती है, जिसे आप पार्स कर रहे हैं
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: नहीं];
[rssParser setShouldResolveExternalEntities: NO];

[आरएसएसपार्स पार्स];

}

यह फ़ंक्शन इंजन को किसी विशेष वेब पते (यूआरएल) पर फ़ाइल डाउनलोड करने और इसे पार्स करने की प्रक्रिया शुरू करने के लिए निर्देश देता है।

हम रिमोट सर्वर को बता रहे हैं कि हम मैक पर चल रहे सफारी हैं, अगर सर्वर मोबाइल संस्करण में आईफोन / आईपैड को रीडायरेक्ट करने का प्रयास करता है।

अंत में विकल्प कुछ एक्सएमएल फाइलों के लिए विशिष्ट हैं। अधिकांश आरएसएस फाइलें और जेनेरिक एक्सएमएल फाइलों को चालू करने की आवश्यकता नहीं होगी।

- (शून्य) पार्सर: (एनएसएक्सएमएल पार्सर *) पार्सर पार्सएररऑक्चर: (एनएसईआरआर *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "त्रुटि कोड% i", [parseError कोड]];
एनएसएलओजी (@ "एक्सएमएल पार्सिंग त्रुटि:% @", त्रुटि स्ट्रिंग);


errorParsing = हाँ;
}

यह एक साधारण त्रुटि-जांच मार्ग है जो एक बाइनरी मान सेट करेगा यदि यह किसी त्रुटि का सामना करता है। आप जो कुछ कर रहे हैं उसके आधार पर आपको यहां कुछ और विशिष्ट आवश्यकता हो सकती है। यदि आपको त्रुटि के मामले में प्रसंस्करण के बाद बस कुछ कोड चलाने की आवश्यकता है, तो त्रुटि उस समय बार्सरी वैरिएबल को कॉल किया जा सकता है।

- (शून्य) पार्सर: (NSXMLParser *) पार्सर किया गया थास्टार्ट एलिमेंट: (एनएसएसटींग *) तत्वनाम नामस्थान: (एनएसएसटींग *) नामस्थान्य योग्यता नाम: (एनएसएसटींग *) qName विशेषताएं: (NSDictionary *) विशेषता डिक्ट {
currentElement = [elementName कॉपी];
ElementValue = [[NSMutableString alloc] init];
अगर ([elementName isEqualToString: @ "item"]) {
आइटम = [[एनएसएमयूटेबल डिक्शनरी आवंटित] init];

}

}

एक्सएमएल पार्सर के मांस में तीन कार्य होते हैं, जो एक व्यक्तिगत तत्व की शुरुआत में चलता है, जो कि तत्व को पार्स करने के बीच में चलता है, और तत्व के अंत में चलता है।

इस उदाहरण के लिए, हम आरएसएस फाइलों के समान फाइल को पार्स कर देंगे जो एक्सएमएल फाइल के भीतर "आइटम" के शीर्षक के तहत समूहों में तत्वों को तोड़ देगा। प्रसंस्करण की शुरुआत में, हम तत्व नाम "आइटम" की जांच कर रहे हैं और जब कोई नया समूह पता चला है तो हमारे आइटम डिक्शनरी को आवंटित कर रहे हैं। अन्यथा, हम मूल्य के लिए हमारे चर शुरू करते हैं।

- (शून्य) पार्सर: (एनएसएक्सएमएल पार्सर *) पार्सर मिला अभियंता: (एनएसएसटींग *) स्ट्रिंग {
[ElementValue appendString: स्ट्रिंग];
}

यह आसान हिस्सा है। जब हमें अक्षर मिलते हैं, तो हम उन्हें अपने चर "ElementValue" में जोड़ते हैं।

- (शून्य) पार्सर: (NSXMLParser *) पार्सर किया गया अंतःकरण: (एनएसएसटींग *) तत्वनाम नामस्थान: (एनएसएसटींग *) नेमस्पेसुरि योग्यता नाम: (एनएसएसटींग *) qName {
अगर ([elementName isEqualToString: @ "item"]) {
[लेख addObject: [आइटम कॉपी]];
} अन्य {
[आइटम सेटऑब्जेक्ट: ElementValue forKey: elementName];
}

}

जब हम किसी तत्व को संसाधित करना समाप्त कर देते हैं, तो हमें दो में से एक कार्य करने की आवश्यकता होती है: (1) यदि अंतिम तत्व "आइटम" है, तो हमने अपना समूह समाप्त कर लिया है, इसलिए हम अपने शब्दकोश को हमारे लेखों में जोड़ देंगे "।

या (2) यदि तत्व "आइटम" नहीं है, तो हम उस शब्द के साथ हमारे शब्दकोश में मान सेट करेंगे जो तत्व के नाम से मेल खाता है। (इसका मतलब है कि हमें XML फ़ाइल के भीतर प्रत्येक फ़ील्ड के लिए एक व्यक्तिगत चर की आवश्यकता नहीं है। हम उन्हें थोड़ा अधिक गतिशील रूप से संसाधित कर सकते हैं।)

- (शून्य) पार्सरडिड डेंड्यूमेंट: (एनएसएक्सएमएल पार्सर *) पार्सर {

अगर (त्रुटि निवारण == नहीं)
{
एनएसएलओजी (@ "एक्सएमएल प्रोसेसिंग किया गया!");
} अन्य {
एनएसएलओजी (@ "एक्सएमएल प्रोसेसिंग के दौरान त्रुटि हुई");
}

}

यह हमारे पार्सिंग दिनचर्या के लिए आवश्यक अंतिम कार्य है। यह बस दस्तावेज़ समाप्त होता है। आप कोई भी कोड डालेंगे जिसे आप यहां प्रक्रिया को खत्म करना चाहते हैं या कुछ भी विशेष जो आप त्रुटि के मामले में करना चाहते हैं।

डिवाइस पर एक फ़ाइल में डेटा और / या एक्सएमएल फ़ाइल को सहेजने के लिए कई ऐप्स यहां करना चाहते हैं। इस तरह, यदि उपयोगकर्ता अगली बार ऐप लोड करते हैं तो इंटरनेट से कनेक्ट नहीं होता है, फिर भी वे इस जानकारी पर प्राप्त कर सकते हैं।

बेशक, हम सबसे महत्वपूर्ण हिस्सा नहीं भूल सकते: फ़ाइल को पार्स करने के लिए अपने एप्लिकेशन को बताएं (और इसे खोजने के लिए इसे एक वेब पता दें!)।

प्रक्रिया शुरू करने के लिए, आपको बस उस कोड की उचित जगह पर जोड़ना होगा जहां आप एक्सएमएल प्रोसेसिंग करना चाहते हैं:

[self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];