XML fayllarini Xcode-da ajralish

Ko'pgina ilovalarning asosiy omili bo'lgan oddiy vazifa XML fayllarini tahlil qilish qobiliyatidir. Yaxshiyamki, Xcode XML faylini Objective-C-ga ajratish uchun nisbatan oson.

XML faylida sizning ilovangiz haqidagi asosiy ma'lumotlardan veb-sayt uchun RSS tasmasi mavjud bo'lishi mumkin. Shuningdek, ular sizning ilovangizda masofadan turib ma'lumotni yangilashning ajoyib usuli bo'lishi mumkin, shuning uchun Apple yangi ikkilikni ro'yxatga yangi element qo'shish uchun faqat yangi ikkilikni topshirish kerak emas.

XML fayllarini Xcode-da qanday ishlashimiz mumkin? Processda ishlatiladigan parametrlarni ishga tushirish, XML ajratuvchi jarayonini boshlash, faylni ishlash jarayonini boshlash, individual elementning boshlanishi, element ichidagi belgilar (qiymat) individual elementning oxiri va ajralish jarayonining oxiri.

Ushbu misolda Internetdan ma'lum bir veb-manzil ( URL ) orqali faylni tahlil qilamiz.

Header faylini yaratish bilan boshlaymiz. Bizning faylni ajratish uchun minimal talablar bilan batafsil ma'lumot tekshiruvi uchun juda muhim bir nom faylining namunasidir:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * maqolalar;
NSMutableDictionary * maqola qo'yilgan;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL-xatoParsing;
}

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

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

ParseXMLFileAtURL funksiyasi biz uchun jarayonni boshlaydi. NSMutableArray "maqola" tugashi bilan bizning ma'lumotlarimiz saqlanadi. Ushbu qator XML faylidagi maydon nomlari bilan bog'liq kalitlarga ega o'zgaruvchi lug'atlardan iborat bo'ladi.

Endi zarur bo'lgan parametrlarni o'rnatdik, biz .m faylidagi jarayonni kutib olamiz:

- (void) parserDidStartDocument: (NSXMLParser *) ajralish uchun {
NSLog (@ "Fayl topildi va parsing boshlandi");

}

Bu funksiya jarayoning boshida ishlaydi. Bu funktsiyaga hech narsa kiritishning hojati yo'q, lekin agar faylni ayrıştırılmaya boshlagan bir vazifani bajarishni istasangiz, kodni qo'yish kerak bo'ladi.

- (void) parseXMLFileAtURL: (NSString *) URL manzili
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, Gecko kabi) Versiya / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[Request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: so'rovni qaytarishResponse: nil xato: nil];


articles = [[NSMutableArray alloc] init];
errorParsing = YO'Q;

rssParser = [[NSXMLParser ajratadi] initWithData: xmlFile];
[rssParser setDelegate: self];

// Siz tekshirayotgan XML fayl turiga qarab, bularning ayrimlarini ochishingiz kerak bo'ladi
[rssParser setShouldProcessNamespaces: YO'Q];
[rssParser setShouldReportNamespacePrefixes: YO'Q];
[rssParser setShouldResolveExternalEntities: YO'Q];

[rssParser parse];

}

Bu funktsiya ma'lum bir web-manzilda (URL) faylni yuklab olishni va uni tahlil qilish jarayonini ishga tushirishni o'rgatadi.

Biz serverni iPhone / iPad- ni mobil versiyaga yo'naltirishga urinayotgan bo'lsa, biz uzoq serverga Macda ishlaydigan Safari deb aytmoqdamiz.

Variantlar oxirida ba'zi XML fayllariga xosdir. Aksariyat RSS fayllari va umumiy XML fayllari ularga yoqilgan bo'lishi shart emas.

- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Xato kodi% i", [parseError kod]];
NSLog (@ "XMLni tahlil qilishda xatolik:% @", errorString);


errorParsing = YES;
}

Bu xato yuzaga kelsa, ikkilik qiymatni belgilaydigan oddiy xato tekshiruvi. Siz nima qilayotganingizdan qat'i nazar, siz bu erda yana aniqroq narsaga muhtojsiz. Agar siz xatolik yuzaga kelganida ishlashdan so'ng ba'zi kodlarni ishlatishingiz kerak bo'lsa, o'sha vaqtda xatoParsing ikkilik o'zgaruvchini chaqirish mumkin.

(NSString *) qName attributes: (NSDictionary *) attributeDict {} {{nsstring *
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
agar ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

XML parserining go'shti uch funktsiyani o'z ichiga oladi: bitta elementning boshida ishlaydi, elementni ajralish jarayonida ishlaydigan va element oxirida ishlaydigan biri.

Ushbu misol uchun XML fayli ichida "elementlar" sarlavhasi ostida elementlarni guruhlarga ajratadigan RSS fayllariga o'xshash faylni tahlil qilamiz. Jarayon boshlanishida biz "element" element nomini tekshirib chiqamiz va yangi guruh aniqlanganda element lug'atini ajratamiz. Aks holda, o'zgaruvchimiz uchun qiymatni ishga tushiramiz.

- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Bu oson. Belgilarni topsak, ularni "ElementValue" o'zgaruvchiga qo'shamiz.

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
agar ([elementName isEqualToString: @ "item"]) {
[article addObject: [maqola nusxasi]];
} Boshqa {
[Item setObject: ElementValue forKey: elementName];
}

}

Agar elementni qayta ishlashni tugatganimizda, biz ikkita narsadan birini bajarishimiz kerak: (1) agar oxirgi element "item" bo'lsa, biz guruhni tugatdik, shuning uchun biz o'z maqolamizga o'z maqolamizni qo'shamiz ".

Yoki (2) agar element "element" bo'lmasa, biz lug'atda qiymat element nomiga mos keladigan kalit bilan o'rnatamiz. (XML fayli ichidagi har bir maydon uchun biz birma-bir o'zgaruvchiga muhtoj emasmiz, ularni biroz ko'proq dinamik tarzda ishlashimiz mumkin.)

- (Void) parserDidEndDocument: (NSXMLParser *) ajraluvchi {

agar (errorParsing == NO)
{
NSLog (@ "XML ishlashi bajarildi!");
} Boshqa {
NSLog (@ "XML jarayonida xato ro'y berdi");
}

}

Bu bizning ajralish tartibini bajarish uchun zarur bo'lgan oxirgi funksiya. U faqat hujjatni tugatadi. Jarayoni yakunlashni istagan har qanday kodni, yoki xato yuzaga kelishi mumkin bo'lgan biron bir narsa kiritasiz.

Bu erda bir nechta ilovalar qilishni xohlashingiz mumkin, bu ma'lumotlarni va / yoki XML faylini qurilmadagi faylga saqlashdir. Shunday qilib, foydalanuvchi keyingi safar ilovani yuklayotgan paytda Internetga ulanmagan bo'lsa, ular bu ma'lumotga kirishlari mumkin.

Albatta, eng muhim qismni unutmasligimiz kerak: arizangizni faylni tahlil qilish (va veb-manzilini topish uchun!).

Jarayonni boshlash uchun, siz ushbu kod satrini XML jarayonini amalga oshirishni xohlagan joyga kiritishingiz kerak bo'ladi:

[O'zingizni parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];