Xcode'da XML fayllarını necə ayırmaq olar?

Bir çox tətbiqin omba olduğu bir sadə tapşırıq, XML fayllarını təhlil etmək qabiliyyətidir. Xoşbəxtlikdən, Xcode bir XML faylını Objective-C-də təhlil etmək üçün nisbətən asanlaşdırır.

Bir XML faylı, tətbiqinizlə bağlı əsas məlumatlardan bir veb səhifəsinə bir RSS feedi içərisində ola bilər. Onlar həmçinin app ərzində uzaqdan məlumatların yenilənməsi üçün böyük bir yol ola bilər, beləliklə bir siyahıya yeni bir maddə əlavə etmək üçün Apple-a yeni bir ikili təqdim etməmə lazımdır.

XML fayllarını Xcode-də necə işləyirik? Bu prosesdə istifadə olunan dəyişənlərin başlanılması, XML parser prosesinin başlanması, bu prosesi bir faylın qidalanması, fərdi elementin başlanması, element içərisində olan simvollar (dəyər) fərdi elementin sonu və təhlil prosesinin sonu.

Bu misalda, İnternetdən xüsusi bir web ünvanı ( URL ) keçərək fayldan ayrılacağız.

Başlıq faylını qurmaqla başlayacağıq. Dosyamızı ayrıştırmak üçün minimum gereksinimlerle Detail View Controller üçün çox əsas başlıq faylının bir örneğidir:

@ interfeysi RootViewController: UITableViewController {
DetailViewController * ətraflıViewController;

NSXMLParser * rssParser;
NSMutableArray * məqalələr;
NSMutableDictionary * maddə;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL xətası;
}

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

- (boş) parseXMLFileAtURL: (NSString *) URL;

ParseXMLFileAtURL funksiyası bizim üçün prosesi başlayacaq. Bitirdiğinde, NSMutableArray "məqalələr" bizim məlumatlarımızı saxlayacaq. Array XML faylında sahə adları ilə əlaqəli düymələrlə dəyişkən lüğətlərdən ibarət olacaq.

İndi lazım olan dəyişənləri qurduqdan sonra, biz .m faylında prosesin qarşılanması üçün hərəkət edəcəyik:

- (boş) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Fayl tapıldı və təhlil edildi");

}

Bu funksiya prosesin başında çalışır. Bu funksiyaya heç bir şey qoymamağa ehtiyac yoxdur, ancaq faylın ayrıştırılmasına başlandığında bir vəzifə yerinə yetirmək istəyirsinizsə, kodu kodlaşdırdığınız yerdir.

- (boş) 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 kimi) Sürüm / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLQeydiyyat tələbWithURL:
[NSURL URLWithString: URL]];
[query setValue: agentString forHTTPHeaderField: @ "İstifadəçi Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: sorğu qaytarmaResponse: nil səhv: nil];


məqalələr = [[NSMutableArray alloc] init];
errorParsing = NO;

rssParser = [[NSXMLParser ayır] initWithData: xmlFile];
[rssParser setDelegate: özünü];

// Ayrıştırdığınız XML faylının növündən asılı olaraq bunların bir qismini dəyişməlisiniz
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Bu funksiya motora müəyyən bir web ünvanı (URL) daxilində bir fayl yükləmək və onu təhlil etmək üçün prosesə başlamaq üçün təlimat verir.

Biz uzaqdan serverə sadəcə olaraq server iPhone / iPad- nun mobil versiyaya yönəldilməsinə çalışırsa, biz Mac-də çalışan bir Safari olduğumuzu deyirik.

Sonda variantları müəyyən XML fayllarına aiddir. Ən çox RSS faylları və ümumi XML faylları onlara açıq olmur.

- (boş) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Səhv kodu% i", [parseError kodu]];
NSLog (@ "XML təhlilində səhv:% @", errorString);


errorParsing = YES;
}

Bu bir səhvlə qarşılaşdıqda ikili dəyər təyin edəcək sadə bir səhv yoxlama marşrutudur. Burada etdiyiniz işlərə görə daha dəqiq bir şeyə ehtiyacınız ola bilər. Sadəcə səhv halında işlədildikdən sonra bəzi kodları çalıştırmanız lazımdırsa, errorParsing ikili dəyişən o vaxt çağırılacaq.

(NSString *) qrammatikası: (NSString *) qName öznitelikleri: (NSDictionary *) atributDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
əgər ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary ayır] init];

}

}

XML parserinin əti üç funksiyanı, fərdi elementin başında, elementin ayrılmasının ortasında çalışan elementdən və elementin sonunda işləyəndən ibarətdir.

Bu nümunə üçün elementləri XML faylı daxilində "maddələr" başlığı altında qruplara bölmək olan RSS fayllarına bənzər bir fayl ayrıştırılacaktır. İşlənmənin başlanğıcında biz elementin "maddə" adını yoxlayır və yeni bir qrup təsbit edildikdə maddə lüğətimizi ayırırıq. Əks təqdirdə, dəyişən üçün dəyərimizi dəyişirik.

- (boş) parser: (NSXMLParser *) ayrıştırıcı aşkarCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Bu asan bir hissəsidir. Biz simvolları tapdıqda, onları dəyişən "ElementValue" ə əlavə edirik.

- (boş) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
əgər ([elementName isEqualToString: @ "item"]) {
[məqalələr addObject: [maddə surəti]];
} başqa {
[item setObject: ElementValue forKey: elementName];
}

}

Bir elementi işləyib bitirdikdən sonra iki şeydən birini yerinə yetirməmiz lazımdır: (1) son element "maddə", əgər biz qrupu bitirdiksə, "sözləri" ".

Və ya (2) əgər element "maddə" deyilsə, dəyərimizi lüğətimizdə elementin adına uyğun olan bir düyməni ilə təyin edəcəyik. (XML faylı daxilində hər bir sahə üçün fərdi dəyişənə ehtiyac yoxdur deməkdir. Onları bir az dinamik şəkildə işləyə bilərik.)

- (boş) parserDidEndDocument: (NSXMLParser *) parser {

əgər (errorParsing == NO)
{
NSLog (@ "XML işlənmişdir!");
} başqa {
NSLog (@ "XML prosesi zamanı xəta baş verdi");
}

}

Bu, təhlil prosedurumuz üçün lazım olan son funksiyadır. Sənədi sadəcə bitirir. Buradakı əməliyyatları bitirmək istədiyiniz hər hansı bir kodu və ya səhv halında istəsəniz xüsusi bir şey qoyacaqsınız.

Bir çox tətbiq burada etmək istədikləri bir şey, məlumatları və / və ya XML faylını cihazdakı bir faylı saxlamaqdır. Beləliklə, istifadəçi növbəti dəfə İnternetə yüklənməməsi halında, bu məlumatları əldə edə bilərlər.

Əlbəttə ki, ən vacib hissəsini unutmayaq: ərizəni faylı təhlil etməli (və onu tapmaq üçün bir web ünvanı verin!).

Prosesi başlamaq üçün sadəcə bu xəttin xəttini XML emal etmək istədiyiniz müvafiq yerə əlavə etmək lazımdır:

[öz-özünə parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];