Cara Mengarsipkan File XML di Xcode

Salah satu tugas sederhana yang merupakan tulang punggung bagi banyak aplikasi adalah kemampuan untuk mengurai file XML. Dan, untungnya, Xcode membuatnya relatif mudah untuk mengurai file XML di Objective-C.

File XML dapat berisi apa pun dari data dasar tentang aplikasi Anda ke umpan RSS untuk situs web. Mereka juga bisa menjadi cara yang bagus untuk memperbarui informasi dalam aplikasi Anda dari jarak jauh, sehingga melewati kebutuhan untuk menyerahkan biner baru ke Apple hanya untuk menambahkan item baru ke daftar.

Jadi bagaimana kita memproses file XML di Xcode? Proses ini berisi langkah-langkah untuk menginisialisasi variabel yang akan digunakan, memulai proses parser XML, memberi makan proses itu file, awal dari elemen individu, karakter (nilai) dalam elemen, akhir dari elemen individual, dan akhir dari proses parsing.

Dalam contoh ini, kita akan mem-parsing file dari Internet dengan meneruskannya alamat web tertentu ( URL ).

Kami akan mulai dengan membangun file header. Ini adalah contoh file header yang sangat mendasar untuk Kontroler Tampilan Detail dengan persyaratan minimum untuk menguraikan file kami:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * artikel;
Item NSMutableDictionary *;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

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

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

Fungsi parseXMLFileAtURL akan memulai proses untuk kami. Ketika selesai, "artikel" NSMutableArray akan menyimpan data kami. Array akan terdiri dari kamus yang bisa berubah dengan kunci yang terkait dengan nama field dalam file XML.

Sekarang setelah kami menyiapkan variabel yang dibutuhkan, kami akan melanjutkan ke pertemuan proses dalam file .m:

- (Batal) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "File ditemukan dan parsing mulai");

}

Fungsi ini berjalan pada awal proses. Tidak perlu memasukkan apa pun dalam fungsi ini, tetapi jika Anda ingin melakukan tugas ketika file mulai diuraikan, ini adalah di mana Anda akan meletakkan kode Anda.

- (Batal) parseXMLFileAtURL: (NSString *) URL
{

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


articles = [[NSMutableArray alloc] init];
errorParsing = TIDAK;

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

// Anda mungkin perlu mengubah beberapa ini tergantung pada jenis file XML yang Anda parsing
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Fungsi ini menginstruksikan mesin untuk mengunduh file di alamat web tertentu (URL) dan memulai proses untuk menguraikannya.

Kami memberi tahu server jarak jauh bahwa kami adalah Safari yang berjalan di Mac kalau-kalau server mencoba mengalihkan iPhone / iPad ke versi seluler.

Opsi di bagian akhir khusus untuk file XML tertentu. Sebagian besar file RSS dan file XML generik tidak perlu dihidupkan.

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

NSString * errorString = [NSString stringWithFormat: @ "Kode kesalahan% i", [kode parseError]];
NSLog (@ "Galat menguraikan XML:% @", errorString);


errorParsing = YES;
}

Ini adalah routing pengecekan error sederhana yang akan mengatur nilai biner jika menemukan kesalahan. Anda mungkin memerlukan sesuatu yang lebih spesifik di sini tergantung pada apa yang Anda lakukan. Jika Anda hanya perlu menjalankan beberapa kode setelah diproses dalam kasus kesalahan, variabel biner errorParsing dapat dipanggil pada saat itu.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) namesName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName atribut: (NSDictionary *) attributeDict {
currentElement = [copy nameName];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

Daging parser XML berisi tiga fungsi, yang berjalan di awal elemen individual, yang berjalan di tengah-tengah parsing elemen, dan yang berjalan di ujung elemen.

Untuk contoh ini, kita akan menguraikan file yang mirip dengan file RSS yang memecah elemen menjadi grup di bawah judul "item" dalam file XML. Pada awal pemrosesan, kami memeriksa nama elemen "item" dan mengalokasikan kamus item kami ketika grup baru terdeteksi. Jika tidak, kami menginisialisasi variabel kami untuk nilainya.

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

Ini adalah bagian yang mudah. Saat kami menemukan karakter, kami cukup menambahkannya ke variabel "ElementValue" kami.

- (Batal) parser: (NSXMLParser *) parser didEndElement: (NSString *) namesName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[artikel addObject: [item copy]];
} lain {
[item setObject: ElementValue forKey: elementName];
}

}

Ketika kita selesai memproses suatu elemen, kita perlu melakukan salah satu dari dua hal: (1) jika elemen akhir adalah "item", kita telah menyelesaikan grup kami, jadi kami akan menambahkan kamus kami ke array kami "artikel ".

Atau (2) jika elemen bukan "item", kami akan menetapkan nilai dalam kamus kami dengan kunci yang cocok dengan nama elemen. (Ini berarti kita tidak memerlukan variabel individual untuk setiap bidang dalam file XML. Kita dapat memprosesnya sedikit lebih dinamis.)

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

if (errorParsing == NO)
{
NSLog (@ "pemrosesan XML selesai!");
} lain {
NSLog (@ "Kesalahan terjadi saat pemrosesan XML");
}

}

Ini adalah fungsi terakhir yang dibutuhkan untuk rutin parsing kami. Itu hanya berakhir dokumen. Anda akan menempatkan kode apa pun yang Anda inginkan untuk menyelesaikan proses di sini atau sesuatu yang khusus yang mungkin ingin Anda lakukan jika terjadi kesalahan.

Satu hal yang mungkin banyak aplikasi lakukan di sini adalah menyimpan data dan / atau file XML ke file di perangkat. Dengan begitu, jika pengguna tidak terhubung ke Internet pada saat mereka memuat aplikasi, mereka masih dapat memperoleh informasi ini.

Tentu saja, kami tidak dapat melupakan bagian terpenting: memberi tahu aplikasi Anda untuk menguraikan file (dan memberinya alamat web untuk menemukannya!).

Untuk memulai proses, Anda hanya perlu menambahkan baris kode ini ke tempat yang sesuai di mana Anda ingin melakukan pemrosesan XML:

[diri parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];