हालांकि एक अंतर्निहित एक्सएमएल पार्सर एक नए डेस्कटॉप या मोबाइल एप्लिकेशन में वास्तविक मूल्य जोड़ता है, उस कार्यक्षमता को कोडिंग करने के लिए आमतौर पर बहुत अधिक विकास समय और बीटा परीक्षण की आवश्यकता होती है। ऐप्पल के एक्सकोड प्रोग्राम में एक एक्सएमएल पार्सर शामिल है जो इस मैनुअल काम के अधिकांश को छोड़ देता है।
एक एक्सएमएल फ़ाइल में आपके ऐप के बारे में बुनियादी डेटा से लेकर a. तक कुछ भी हो सकता है आरएसएस फ़ीड एक वेबसाइट के लिए। वे दूरस्थ रूप से आपके ऐप के भीतर जानकारी अपडेट करने का एक शानदार तरीका भी हो सकते हैं, इस प्रकार एक सूची में एक नया आइटम जोड़ने के लिए ऐप्पल को एक नया बाइनरी सबमिट करने की आवश्यकता को छोड़कर।
एक्सकोड प्रक्रिया
बिल्ट-इन Xcode प्रक्रिया में उपयोग किए जाने वाले वेरिएबल्स को इनिशियलाइज़ करने के लिए चरण होते हैं, XML पार्सर प्रक्रिया शुरू करना, उस प्रक्रिया को एक फ़ाइल फीड करना, उन तत्वों के भीतर व्यक्तिगत तत्वों और पात्रों (मूल्य) का आकलन करना, एक व्यक्तिगत तत्व के अंत को पहचानना, और पार्सिंग को समाप्त करना प्रक्रिया।
एक्सएमएल पार्सर का प्रयोग करें
विवरण को स्पष्ट करने के लिए, हम इंटरनेट से एक उदाहरण फ़ाइल को एक विशेष वेब पता पास करके पार्स करेंगे (यूआरएल).
हेडर फ़ाइल बनाने से शुरू करें। यह हमारी फ़ाइल को पार्स करने के लिए न्यूनतम आवश्यकताओं के साथ एक विवरण दृश्य नियंत्रक के लिए एक बहुत ही बुनियादी हेडर फ़ाइल का एक उदाहरण है:
@interface रूटव्यू कंट्रोलर: UITableViewController {
डिटेल व्यू कंट्रोलर * डिटेल व्यू कंट्रोलर;
NSXMLParser *rssParser;
एनएसएमयूटेबलएरे *लेख;
एनएसएमयूटेबल डिक्शनरी *आइटम;
एनएसएसटींग * वर्तमान एलिमेंट;
NSMutableString *ElementValue;
बूल त्रुटि पार्सिंग;
}
@property (गैर-परमाणु, बनाए रखें) IBOutlet DetailViewController *detailViewController;
- (शून्य) parseXMLFileAtURL:(NSString *)URL;
ParseXMLFileAtURL फ़ंक्शन प्रक्रिया प्रारंभ करता है। जब यह समाप्त हो जाता है, तो एनएसएमयूटेबलएरे "लेख" डेटा रखता है। सरणी में परिवर्तनशील शब्दकोश होते हैं जिनमें XML फ़ाइल में फ़ील्ड नामों से संबंधित कुंजियाँ होती हैं।
अगला, प्रक्रिया प्रारंभ करें:
- (शून्य) parserDidStartDocument:(NSXMLParser *)parser{
NSLog (@ "फ़ाइल मिली और पार्सिंग शुरू हुई");
}
यह फ़ंक्शन प्रक्रिया की शुरुआत में चलता है। इस फ़ंक्शन में कुछ भी डालने की आवश्यकता नहीं है, लेकिन यदि आप फ़ाइल को पार्स करना शुरू करते समय कोई कार्य करना चाहते हैं, तो यह वह जगह है जहां आप अपना कोड डालेंगे।
प्रोग्राम को कुछ डाउनलोड करने का निर्देश दें
इसके बाद, प्रोग्राम को कुछ डाउनलोड करने का निर्देश दें:
- (शून्य) parseXMLFileAtURL:(NSString *)URL
{
एनएसएसटींग *एजेंटस्ट्रिंग = @"मोज़िला/5.0 (मैकिंटोश; यू; इंटेल मैक ओएस एक्स 10_5_6; en-us) AppleWebKit/525.27.1 (KHTML, जैसे छिपकली) संस्करण/3.2.1 Safari/525.27.1";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[एनएसयूआरएल यूआरएलविथस्ट्रिंग: यूआरएल]];
[अनुरोध सेटवैल्यू: HTTPHeaderField के लिए एजेंटस्ट्रिंग: @ "उपयोगकर्ता-एजेंट"];
xmlFile = [NSURLConnection SendSynchronousRequest: रिक्वेस्ट रिटर्निंग रिस्पॉन्स: nil एरर: nil];
लेख = [[NSMutableArray आवंटन] init];
त्रुटि पार्सिंग = नहीं;
rssParser = [[NSXMLParser आवंटन] initWithData: xmlFile];
[rssParser सेट डिलीगेट: स्वयं];
// आपके द्वारा पार्स की जा रही XML फ़ाइल के प्रकार के आधार पर आपको इनमें से कुछ को चालू करने की आवश्यकता हो सकती है
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: नहीं];
[rssParser पार्स];
}
यह फ़ंक्शन इंजन को किसी विशेष वेब पते (यूआरएल) पर एक फ़ाइल डाउनलोड करने और इसे पार्स करने की प्रक्रिया शुरू करने का निर्देश देता है। हम रिमोट सर्वर को बता रहे हैं कि हम मैक पर चलने वाले सफारी हैं, अगर सर्वर आईफोन/आईपैड को मोबाइल संस्करण पर रीडायरेक्ट करने का प्रयास करता है।
अंत में विकल्प कुछ एक्सएमएल फाइलों के लिए विशिष्ट हैं। अधिकांश RSS फ़ाइलें और सामान्य XML फ़ाइलों को चालू करने की आवश्यकता नहीं होगी।
त्रुटि-परिणाम जांचें
परिणाम पर कुछ बुनियादी त्रुटि-जांच करें:
- (शून्य) पार्सर: (NSXMLParser *) पार्सर parseErrorOccurred: (NSError *) parseError {
NSString *errorString = [NSString stringWithFormat:@"त्रुटि कोड %i", [parseError code]];
NSLog(@"XML पार्स करने में त्रुटि: %@", errorString);
त्रुटि पार्सिंग = हाँ;
}यह त्रुटि-जांच रूटिंग एक त्रुटि का सामना करने पर एक बाइनरी मान सेट करता है। आप जो कर रहे हैं उसके आधार पर आपको यहां कुछ और विशिष्ट की आवश्यकता हो सकती है। यदि आपको त्रुटि के मामले में प्रसंस्करण के बाद बस कुछ कोड चलाने की आवश्यकता है, तो
यह त्रुटि-जांच दिनचर्या एक त्रुटि का सामना करने पर एक बाइनरी मान सेट करती है। आप जो कर रहे हैं उसके आधार पर आपको यहां कुछ और विशिष्ट की आवश्यकता हो सकती है। यदि आपको त्रुटि के मामले में प्रसंस्करण के बाद बस कुछ कोड चलाने की आवश्यकता है, तो उस समय बाइनरी चर को पार्स करने में त्रुटि को कॉल किया जा सकता है।
पुनर्प्राप्त सामग्री का विश्लेषण करें
इसके बाद, प्रोग्राम पुनः प्राप्त सामग्री को तोड़ता है और उसका विश्लेषण करता है:
- (शून्य) पार्सर: (एनएसएक्सएमएलपार्सर *) पार्सर ने स्टार्ट एलिमेंट: (एनएसएसटींग *) एलिमेंट नेम नेमस्पेसुरी: (एनएसएसटींग *) नेमस्पेसयूआरआई क्वालिफाइडनाम: (एनएसएसटींग *) क्यूनाम एट्रिब्यूट्स: (एनएस डिक्शनरी *) एट्रीब्यूट डिक्ट {
currentElement = [तत्वनाम प्रतिलिपि];
ElementValue = [[NSMutableString आवंटन] init];
अगर ([elementName isEqualToString:@"item"]) {
आइटम = [[NSMutableDictionary आवंटन] init];
}
}
XML पार्सर के मांस में तीन कार्य होते हैं, एक जो किसी व्यक्ति की शुरुआत में चलता है तत्व, एक जो तत्व को पार्स करने के बीच में चलता है, और एक जो अंत में चलता है तत्व।
इस उदाहरण के लिए, हम RSS फ़ाइलों के समान एक फ़ाइल को पार्स करेंगे जो तत्वों को शीर्षक के अंतर्गत समूहों में विभाजित करती है आइटम एक्सएमएल फ़ाइल के भीतर। प्रसंस्करण की शुरुआत में, हम तत्व नाम "आइटम" की जांच कर रहे हैं और एक नए समूह का पता चलने पर हमारे आइटम शब्दकोश को आवंटित कर रहे हैं। अन्यथा, हम अपने वेरिएबल को वैल्यू के लिए इनिशियलाइज़ करते हैं:
- (शून्य) पार्सर: (NSXMLParser *) पार्सर पाया गया वर्ण: (एनएसएसटींग *) स्ट्रिंग {
[एलिमेंटवैल्यू एपेंडस्ट्रिंग: स्ट्रिंग];
}
जब हमें वर्ण मिलते हैं, तो हम बस उन्हें अपने चर में जोड़ देते हैं एलिमेंट वैल्यू:
- (शून्य) पार्सर: (एनएसएक्सएमएलपार्सर *) पार्सर ने एंड एलीमेंट: (एनएसएसटींग *) एलिमेंट नेम नेमस्पेसुरी: (एनएसएसटींग *) नेमस्पेसयूरी क्वालिफाइडनाम: (एनएसएसटींग *) क्यूनाम {
अगर ([elementName isEqualToString:@"item"]) {
[लेख addObject:[आइटम कॉपी]];
} अन्य {
[आइटम सेटऑब्जेक्ट: ElementValue forKey: elementName];
}
}
पार्सिंग पूर्ण होने पर क्या होता है
जब प्रोग्राम किसी तत्व को संसाधित करना समाप्त करता है, तो उसे दो चीजों में से एक करना होगा:
- यदि अंतिम तत्व है मद, हमने अपना समूह समाप्त कर लिया है, इसलिए हम अपने लेखों की श्रेणी में अपना शब्दकोश जोड़ देंगे।
- यदि तत्व नहीं है मद, हम तत्व के नाम से मेल खाने वाली कुंजी के साथ अपने शब्दकोश में मान सेट करेंगे। (इसका मतलब है कि हमें एक्सएमएल फ़ाइल के भीतर प्रत्येक फ़ील्ड के लिए एक व्यक्तिगत चर की आवश्यकता नहीं है। हम उन्हें थोड़ा और गतिशील रूप से संसाधित कर सकते हैं।)
यह हमारे पार्सिंग रूटीन के लिए आवश्यक अंतिम कार्य है; यह दस्तावेज़ समाप्त करता है। यहां कोई भी अंतिम कोड डालें या त्रुटि-सुधार करने वाला सबरूटीन निर्दिष्ट करें:
- (शून्य) parserDidEndDocument:(NSXMLParser *)parser {
अगर (त्रुटि पार्सिंग == नहीं)
{
एनएसएलओजी(@"एक्सएमएल प्रोसेसिंग पूर्ण!");
} अन्य {
NSLog (@ "XML प्रसंस्करण के दौरान त्रुटि हुई");
}
}
जानकारी को बचाना
एक चीज जो कई ऐप यहां करना चाहते हैं, वह है डेटा या एक्सएमएल फाइल को डिवाइस पर फाइल में सेव करना। इस तरह, यदि डिवाइस अगली बार ऐप लोड होने पर इंटरनेट से कनेक्ट नहीं है, तब भी वह इस जानकारी को प्राप्त कर सकता है।
बेशक, हम सबसे महत्वपूर्ण भाग को नहीं भूल सकते: फ़ाइल को पार्स करने के लिए अपने आवेदन को बताना (और इसे खोजने के लिए इसे एक वेब पता देना!) प्रक्रिया शुरू करने के लिए, कोड की इस पंक्ति को उस उपयुक्त स्थान पर जोड़ें जहाँ आप XML प्रसंस्करण करना चाहते हैं:
[स्वयं parseXMLFileAtURL:@" http://www.webaddress.com/file.xml"];