Xcode'ta XML Dosyaları Nasıl Ayrılır

Birçok uygulamaya omurga olan basit bir görev, XML dosyalarını ayrıştırma yeteneğidir. Ve neyse ki Xcode, Objective-C'deki bir XML dosyasını ayrıştırmayı göreceli olarak kolaylaştırıyor.

Bir XML dosyası, uygulamanızla ilgili temel verilerden bir web sitesi için RSS yayınına kadar herhangi bir şey içerebilir. Ayrıca, uygulamanızdaki bilgileri uzaktan güncellemeniz için harika bir yol olabilir. Böylece, yeni bir öğeyi listeye eklemek için Apple'a yeni bir ikili göndermeye gerek kalmaz.

Xcode'ta XML dosyalarını nasıl işleyebiliriz? İşlem, kullanılacak olan değişkenleri başlatmak, XML ayrıştırıcı sürecini başlatmak, bir dosyayı işlemek, tek bir öğenin başlangıcı, eleman içindeki karakterleri (değer) başlatmak için gerekli adımları içerir. Bireysel elemanın sonu ve ayrıştırma sürecinin sonu.

Bu örnekte, belirli bir web adresini ( URL ) ileterek bir dosyayı İnternet'ten ayrıştıracağız.

Başlık dosyasını oluşturmaya başlarız. Bu, Ayrıntı Görünüm Denetleyicisi için dosyamızı ayrıştırmak için gereken minimum gereksinimleri içeren çok basit bir başlık dosyasının bir örneğidir:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * makaleleri;
NSMutableDictionary * öğe;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@ mülkiyeti (nonatomic, muhafaza) IBOutlet DetailViewController * detailViewController;

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

ParseXMLFileAtURL işlevi bizim için süreci başlatacak. Tamamlandığında, NSMutableArray "makaleler" verilerimizi tutacaktır. Dizi, XML dosyasındaki alan adlarıyla ilgili anahtarlarla değiştirilebilen sözlüklerden oluşacaktır.

Artık gerekli değişkenleri oluşturduğumuza göre, .m dosyasındaki sürecin toplantısına geçeceğiz:

- (void) parserDidStartDocument: (NSXMLParser *) ayrıştırıcı {
NSLog (@ "Dosya bulundu ve ayrıştırma başladı");

}

Bu işlev işlemin başında çalışır. Bu işleve herhangi bir şey koymanıza gerek yoktur, ancak dosya ayrıştırmaya başladığında bir görevi gerçekleştirmek istiyorsanız, kodunuzu koyacağınız yer burasıdır.

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

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (Gecko gibi KHTML) Sürüm / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "Kullanıcı Aracı"];
xmlFile = [NSURLConnection sendSchronchronRequest: request returnningResponse: nil error: nil];


makaleler = [[NSMutableArray ayırma] init];
errorParsing = HAYIR;

rssParser = [[NSXMLParser ayırma] initWithData: xmlFile];
[rssParser setDelegate: kendi];

// Ayrıştığınız XML dosyasının türüne bağlı olarak bunlardan bazılarını döndürmeniz gerekebilir.
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser ayrıştırması];

}

Bu işlev, motoru belirli bir web adresinde (URL) bir dosya indirmesini ve ayrıştırma işlemini başlatmasını sağlar.

Sunucu, iPhone / iPad'i bir mobil sürüme yönlendirmeye çalıştığında, uzak sunucuyu Mac üzerinde çalışan bir Safari olduğumuzu söylüyoruz.

Sonundaki seçenekler belirli XML dosyalarına özgüdür. Çoğu RSS dosyası ve genel XML dosyasının açılmasına gerek yoktur.

- (void) ayrıştırıcı: (NSXMLParser *) ayrıştırıcı parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Hata kodu% i", [parseError code]];
NSLog (@ "XML ayrıştırılırken hata oluştu:% @", errorString);


errorParsing = EVET;
}

Bu, bir hatayla karşılaşırsa ikili bir değer ayarlayan basit bir hata kontrol yoludur. Ne yaptığınıza bağlı olarak burada daha spesifik bir şeye ihtiyacınız olabilir. Hata durumunda işlendikten sonra bazı kodları çalıştırmanız gerekirse, o anda errorParsing ikili değişkeni çağrılabilir.

- (void) ayrıştırıcı: (NSXMLParser *) ayrıştırıcı didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName öznitelikleri: (NSDictionary *) attributeDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "item"]) {
öğe = [[NSMutableDictionary tahsis] init];

}

}

XML ayrıştırıcısının eti, öğenin ayrıştırılması sırasında çalışan ve öğenin sonunda çalışan bir öğenin başında çalışan üç işlevi içerir.

Bu örnekte, XML dosyasındaki "öğeler" başlığı altındaki öğeleri gruplara ayıran RSS dosyalarına benzer bir dosyayı ayrıştıracağız. İşlemin başlangıcında, yeni bir grup tespit edildiğinde öğe öğesini "öğe" olarak kontrol etmek ve madde sözlüğümüzü ayırmaktayız. Aksi halde, değişkeni değer için başlatırız.

- (void) ayrıştırıcı: (NSXMLParser *) ayrıştırıcı foundCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Bu kolay kısım. Karakterleri bulduğumuzda, onları "ElementValue" değişkenimize eklemekteyiz.

- (void) ayrıştırıcı: (NSXMLParser *) ayrıştırıcı didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[makaleler addObject: [item copy]];
} Başka {
[öğe setObject: ElementValue forKey: elementName];
}

}

Bir öğeyi işlediğimizde, iki şeyden birini yapmamız gerekir: (1) son öğe "öğe" ise, grubumuzu tamamladık, bu yüzden sözlüğümüzü "makaleler dizimize ekleyeceğiz" ".

Veya (2) öğe "öğe" değilse, sözlüğümüzdeki değeri, öğenin adıyla eşleşen bir anahtarla ayarlayacağız. (Bu, XML dosyasındaki her alan için bireysel bir değişkene ihtiyacımız olmadığı anlamına gelir. Onları biraz daha dinamik olarak işleyebiliriz.)

- (void) parserDidEndDocument: (NSXMLParser *) ayrıştırıcı {

eğer (errorParsing == NO)
{
NSLog (@ "XML işlemi tamamlandı!");
} Başka {
NSLog (@ "XML işlemi sırasında hata oluştu");
}

}

Bu, ayrıştırma yordamımız için gereken son işlevdir. Sadece belgeyi sonlandırır. İşlemi tamamlamak istediğiniz herhangi bir kodu veya hata durumunda yapmak isteyebileceğiniz özel bir şey koyacaksınız.

Birçok uygulamanın burada yapmak isteyebileceği bir şey, verileri ve / veya XML dosyasını cihazdaki bir dosyaya kaydetmek. Bu şekilde, kullanıcı uygulamayı yüklediklerinde İnternet'e bağlı değilse, yine de bu bilgilere erişebilirler.

Tabii ki en önemli kısmı unutamayacağız: Uygulamanızın dosyayı ayrıştırmasını söylemek (ve onu bulmak için bir web adresi vermek!).

İşlemi başlatmak için, bu kod satırını XML işlemeyi yapmak istediğiniz yere uygun bir yere eklemeniz yeterlidir:

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