كيفية تحليل ملفات XML في Xcode

مهمة واحدة بسيطة هي العمود الفقري للعديد من التطبيقات هي القدرة على تحليل ملفات XML. ولحسن الحظ ، يجعل Xcode من السهل نسبياً تحليل ملف XML في Objective-C.

يمكن أن يحتوي ملف XML على أي شيء من البيانات الأساسية حول تطبيقك إلى خلاصة RSS لموقع الويب. ويمكن أن تكون أيضًا طريقة رائعة لتحديث المعلومات داخل تطبيقك عن بُعد ، وبالتالي تجاوز الحاجة إلى إرسال ثنائي جديد إلى Apple ببساطة لإضافة عنصر جديد إلى قائمة.

إذاً كيف نقوم بمعالجة ملفات XML في Xcode؟ تحتوي العملية على خطوات لتهيئة المتغيرات المستخدمة ، بدء عملية محلل XML ، تغذية عملية ملف ، بداية عنصر فردي ، الحروف (القيمة) داخل العنصر ، نهاية عنصر فردي ، ونهاية عملية التحليل.

في هذا المثال ، سنجري تحليل ملف من الإنترنت عن طريق تمرير عنوان ويب معين ( URL ).

سنبدأ ببناء ملف الرأس. هذا مثال لملف رأس أساسي للغاية لوحدة تحكم عرض التفاصيل مع الحد الأدنى لمتطلبات تحليل ملفنا:

interface RootViewController: UITableViewController {
DetailViewController * detailViewController؛

NSXMLParser * rssParser؛
NSMutableArray * articles؛
NSMutableDictionary * item؛
NSString * currentElement
NSMutableString * ElementValue ،
خطأ في BOOL
}

property (nonatomic، retain) IBOutlet DetailViewController * detailViewController؛

- (void) parseXMLFileAtURL: (NSString *) URL؛

ستبدأ وظيفة parseXMLFileAtURL العملية بالنسبة لنا. عندما تنتهي ، فإن "المقالات" NSMutableArray سيعقد بياناتنا. سوف يتكون الصفيف من قواميس قابلة للتغيير مع مفاتيح مرتبطة بأسماء الحقول في ملف XML.

الآن بعد أن قمنا بإعداد المتغيرات اللازمة ، سننتقل إلى تلبية العملية في الملف .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "تم العثور على الملف وتحليله") ؛

}

هذه الوظيفة تعمل في بداية العملية. ليست هناك حاجة لوضع أي شيء في هذه الوظيفة ، ولكن إذا كنت تريد تنفيذ مهمة عند بدء تحليل الملف ، فهذا هو المكان الذي ستضع فيه شفرتك.

- (باطل) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh؛ U؛ Intel Mac OS X 10_5_6؛ en-us) AppleWebKit / 525.27.1 (KHTML ، مثل Gecko) الإصدار / 3.2.1 Safari / 525.27.1"؛
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]]؛
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"]؛
xmlFile = [NSURLConnection sendSynchronousRequest: return returnResponse: nil error: nil]؛


المقالات = [[NSMutableArray alloc] init]؛
errorParsing = NO؛

rssParser = [[NSXMLParser alloc] initWithData: xmlFile]؛
[rssParser setDelegate: self]؛

// قد تحتاج إلى تشغيل بعض هذه العناصر اعتماداً على نوع ملف XML الذي تقوم بتحليله
[rssParser setShouldProcessNamespaces: NO]؛
[rssParser setShouldReportNamespacePrefixes: NO]؛
[rssParser setShouldResolveExternalEntities: NO]؛

[rssParser parse]؛

}

تقوم هذه الدالة بتوجيه المحرك لتنزيل ملف على عنوان ويب معين (URL) وبدء عملية تحليله.

نحن نخبر الخادم البعيد أننا سفاري يعمل على نظام التشغيل Mac فقط في حالة محاولة الخادم إعادة توجيه جهاز iPhone / iPad إلى إصدار الجوال.

تكون الخيارات في النهاية خاصة بملفات XML معينة. لن تحتاج معظم ملفات RSS وملفات XML العامة إلى تشغيلها.

- محلل (void): (NSXMLParser *) محلل parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Error code٪ i"، [parseError code]]؛
NSLog (@ "خطأ في تحليل XML:٪ @" ، errorString) ؛


errorParsing = YES.
}

يعد هذا مسارًا بسيطًا لفحص الأخطاء يقوم بتحديد قيمة ثنائية إذا واجه خطأ. قد تحتاج إلى شيء أكثر تحديدًا هنا اعتمادًا على ما تفعله. إذا كنت تحتاج فقط إلى تشغيل بعض التعليمات البرمجية بعد المعالجة في حالة حدوث خطأ ، يمكن استدعاء متغير errorParsing ثنائي في ذلك الوقت.

- محلل (void): (NSXMLParser *) محلل didStartElement: (NSString *) elementName namesName: (NSString *) namespaceURI مؤهل الاسم: (NSString *) qName السمات: (NSDictionary *) attributeDict {
currentElement = [elementName copy]؛
ElementValue = [[NSMutableString alloc] init]؛
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init]؛

}

}

يحتوي لحم محلل XML على ثلاث وظائف ، واحد يعمل في بداية عنصر فردي ، واحد يعمل خلال منتصف تحليل العنصر ، وواحد يعمل في نهاية العنصر.

في هذا المثال ، سنقوم بتحليل ملف مشابه لملفات RSS التي تقوم بتقسيم العناصر إلى مجموعات تحت عنوان "عناصر" داخل ملف XML. في بداية المعالجة ، نقوم بالتحقق من اسم العنصر "item" ونخصص قاموس المادة عند اكتشاف مجموعة جديدة. خلاف ذلك ، نقوم بتهيئة المتغير الخاص بنا للقيمة.

- محلل (void): (NSXMLParser *) محلل تم العثور على أحرف: (NSString *) string {
[ElementValue appendString: string]؛
}

هذا هو الجزء السهل. عندما نجد شخصيات ، نضيفها ببساطة إلى متغير "ElementValue".

محلل (void): (NSXMLParser *) محلل didEndElement: (NSString *) elementName namesName: (NSString *) namespaceURI مؤهل الاسم: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[المقالات addObject: [item copy]]؛
} آخر {
[item setObject: ElementValue forKey: elementName]؛
}

}

عندما ننتهي من معالجة عنصر ، نحتاج إلى القيام بأحد الأمرين التاليين: (1) إذا كان العنصر النهائي هو "عنصر" ، فقد انتهينا من مجموعتنا ، لذلك سنقوم بإضافة قاموسنا إلى مجموعة من "المقالات" ".

أو (2) إذا لم يكن العنصر "عنصر" ، فسنقوم بتعيين القيمة في قاموسنا بمفتاح يطابق اسم العنصر. (هذا يعني أننا لا نحتاج إلى متغير فردي لكل حقل داخل ملف XML. يمكننا معالجتها بشكل أكثر ديناميكية.)

- (void) parserDidEndDocument: (NSXMLParser *) parser {

if (errorParsing == NO)
{
NSLog (@ "معالجة XML تمت!") ؛
} آخر {
NSLog (@ "حدث خطأ أثناء معالجة XML")؛
}

}

هذه هي آخر وظيفة مطلوبة لروتين التحليل الخاص بنا. انه ببساطة ينهي الوثيقة. ستضع أي كود تريد إنهاء العملية هنا أو أي شيء خاص قد ترغب في القيام به في حالة الخطأ.

هناك شيء واحد ترغب في أن تفعله العديد من التطبيقات هنا هو حفظ البيانات و / أو ملف XML إلى ملف على الجهاز. بهذه الطريقة ، إذا لم يكن المستخدم متصلاً بالإنترنت في المرة القادمة التي يقوم فيها بتحميل التطبيق ، فلا يزال بإمكانه الحصول على هذه المعلومات.

بالطبع ، لا يمكننا أن ننسى الجزء الأكثر أهمية: إخبار التطبيق الخاص بك لتحليل الملف (وإعطائه عنوان ويب للعثور عليه في!).

لبدء العملية ، تحتاج ببساطة إلى إضافة هذا السطر من التعليمة البرمجية إلى المكان المناسب حيث تريد إجراء معالجة XML:

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