Bagaimana Menguraikan Fail XML dalam Xcode

Satu tugas mudah yang merupakan tulang belakang kepada banyak aplikasi adalah keupayaan untuk menghuraikan fail XML. Dan, mujurlah, Xcode menjadikannya mudah untuk mengurai fail XML dalam Objektif-C.

Fail XML boleh mengandungi apa-apa dari data asas mengenai aplikasi anda ke suapan RSS untuk laman web. Mereka juga boleh menjadi cara yang baik untuk mengemas kini maklumat dalam aplikasi anda dari jauh, dengan itu melangkaui keperluan untuk menyerahkan binari baru ke Apple hanya untuk menambah item baru ke senarai.

Jadi bagaimana kita memproses fail XML dalam Xcode? Proses ini mengandungi langkah-langkah untuk menginisialisasi pembolehubah yang akan digunakan, memulakan proses parser XML, memberi makan proses yang satu file, permulaan elemen individu, karakter (nilai) dalam elemen, akhir elemen individu, dan akhir proses parsing.

Dalam contoh ini, kami akan mem-parsing fail dari Internet dengan menghantarnya alamat web tertentu ( URL ).

Kami akan mulakan dengan membina fail header. Ini adalah contoh fail header yang sangat asas untuk Peninjau View Detail dengan syarat minimum untuk menguraikan fail kami:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
Artikel NSMutableArray *;
Item NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
Ralat BOOLPenyandaan;
}

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

- (tidak sah) parseXMLFileAtURL: (NSString *) URL;

Fungsi parseXMLFileAtURL akan memulakan proses untuk kami. Apabila ia selesai, "artikel" NSMutableArray akan memegang data kami. Arahan ini akan terdiri daripada kamus yang boleh berubah dengan kekunci yang berkaitan dengan nama medan dalam fail XML.

Sekarang bahawa kami telah menyediakan pembolehubah yang diperlukan, kami akan beralih kepada proses bertemu dalam fail .m:

- (tidak sah) parserDidStartDocument: (parser NSXMLParser *) {
NSLog (@ "Fail ditemui dan parsing bermula");

}

Fungsi ini berjalan pada permulaan proses. Tidak perlu meletakkan apa-apa dalam fungsi ini, tetapi jika anda ingin melakukan tugas apabila fail mula diurai, ini adalah tempat anda meletakkan kod anda.

- (tidak sah) URL parseXMLFileAtURL: (NSString *)
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, seperti Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[permintaan setValue: agentString untukHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: error nil: nil];


artikel = [[NSMutableArray] init];
errorParsing = NO;

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

// Anda mungkin perlu mengubah beberapa perkara ini bergantung pada jenis fail XML yang anda sedang menguraikan
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Fungsi ini mengarahkan enjin untuk memuat turun fail di alamat web tertentu (URL) dan memulakan proses untuk mengurai.

Kami memberitahu pelayan jauh bahawa kami adalah Safari yang berjalan pada Mac sekiranya pelayan cuba mengalihkan iPhone / iPad ke versi mudah alih.

Opsyen pada akhir adalah khusus untuk fail XML tertentu. Kebanyakan fail RSS dan fail XML generik tidak memerlukannya dihidupkan.

- (kosong) parser: (NSXMLParser *) parserErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Kod ralat% i", [kod parseError]];
NSLog (@ "Error parsing XML:% @", errorString);


errorParsing = YES;
}

Ini adalah routing pemeriksaan ralat yang mudah yang akan menetapkan nilai binari jika ia menemui ralat. Anda mungkin memerlukan sesuatu yang lebih khusus di sini bergantung kepada apa yang anda lakukan. Jika anda hanya perlu menjalankan beberapa kod selepas memproses dalam kes ralat, pembolehubah biner ralatParsing boleh dipanggil pada masa itu.

parser: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (attributeDict {
currentElement = [copyNameName];
ElementValue = [[NSMutableString alloc] init];
jika ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

Daging parser XML mengandungi tiga fungsi, satu yang berjalan pada permulaan elemen individu, satu yang berjalan pada tengah-tengah parsing elemen, dan satu yang berjalan pada akhir elemen.

Untuk contoh ini, kami akan mem-parsing fail serupa dengan fail RSS yang memecah elemen menjadi kumpulan di bawah tajuk "item" dalam fail XML. Pada permulaan pemprosesan, kami menyemak nama "item" nama unsur dan memperuntukkan kamus item kami apabila kumpulan baru dikesan. Jika tidak, kita mulakan pemboleh ubah kami untuk nilai itu.

- (tidak sah) parser: (parser NSXMLParser *) ditemuiCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Ini adalah bahagian yang mudah. Apabila kita mencari watak-watak, kita hanya menambahnya kepada pembolehubah "ElementValue" kita.

parser: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
jika ([elementName isEqualToString: @ "item"]) {
[artikel addObject: [salinan item]];
} else {
[item setObject: ElementValue forKey: elementName];
}

}

Apabila kami selesai memproses elemen, kami perlu melakukan salah satu daripada dua perkara: (1) jika elemen akhir adalah "item", kami telah selesai kumpulan kami, jadi kami akan menambah kamus kami kepada pelbagai "artikel ".

Atau (2) jika elemen itu bukan "item", kami akan menetapkan nilai dalam kamus kami dengan kunci yang sepadan dengan nama elemen. (Ini bermakna kita tidak memerlukan pembolehubah individu untuk setiap medan dalam fail XML. Kita boleh memprosesnya sedikit lebih dinamik.)

- (tidak sah) parserDidEndDocument: (parser NSXMLParser *) {

jika (errorParsing == NO)
{
NSLog (@ "pemproses XML selesai!");
} else {
NSLog (@ "Ralat berlaku semasa pemprosesan XML");
}

}

Ini adalah fungsi terakhir yang diperlukan untuk rutin parsing kami. Ia hanya menamatkan dokumen. Anda akan meletakkan sebarang kod yang anda mahu menyelesaikan proses di sini atau sesuatu yang istimewa yang anda ingin lakukan sekiranya berlaku kesilapan.

Satu perkara yang boleh dilakukan oleh banyak aplikasi di sini adalah untuk menyimpan data dan / atau fail XML pada fail pada peranti. Dengan cara itu, jika pengguna tidak disambungkan ke Internet pada masa lain mereka memuatkan aplikasi, mereka masih boleh mendapatkan maklumat ini.

Sudah tentu, kita tidak boleh melupakan bahagian yang paling penting: memberitahu permohonan anda untuk mengurai fail (dan memberikannya alamat web untuk mendapatkannya!).

Untuk memulakan proses, anda hanya perlu menambah baris kod ini ke tempat yang sesuai di mana anda ingin melakukan pemprosesan XML:

[parse diriXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];