Како да се анализираат XML датотеките во Xcode

Една едноставна задача која е 'рбетот на многу апликации е способноста да се анализираат XML-датотеките. И, за среќа, Xcode прави релативно лесно да се анализира XML-датотека во Objective-C.

XML датотека може да содржи нешто од основни податоци за вашата апликација до RSS фидот за веб-страница. Тие, исто така, можат да бидат одличен начин за ажурирање на информациите во вашата апликација од далечина, на тој начин заобиколувајќи ја потребата да поднесете нова бинарна на Apple, едноставно за да додадете нова ставка во листата.

Па како да ги обработуваме XML-датотеките во Xcode? Процесот содржи чекори за иницијализација на променливите кои треба да се користат, започнувајќи го XML парсерот процес, хранејќи го тој процес датотека, почеток на поединечен елемент, знаци (вредност) во елементот, крајот на поединечниот елемент, и крајот на процесот на парсирање.

Во овој пример, ние ќе бидеме анализирање на датотека од Интернет преку пренесување на одредена веб адреса ( URL ).

Ќе започнеме со изработка на заглавието. Ова е пример за многу основни датотеки за заглавје за контролор за детален приказ со минималните барања за анализа на нашата датотека:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * статии;
NSMutableDictionary * ставка;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

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

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

Функцијата parseXMLFileAtURL ќе го започне процесот за нас. Кога ќе заврши, NSMutableArray "статиите" ќе ги држат нашите податоци. Низата ќе биде составена од менливи речници со клучеви поврзани со имињата на полето во XML-датотеката.

Сега, кога ги поставивме потребните варијабли, ќе продолжиме со исполнување на процесот во .m-датотеката:

- (void) parserDidStartDocument: (NSXMLParser *) парсерот {
NSLog (@ "Пронајдена датотека и парсирање започна");

}

Оваа функција работи на почетокот на процесот. Нема потреба да се става ништо во оваа функција, но ако сакате да извршите задача кога датотеката ќе почне да се анализира, тука е местото каде што ќе го ставите вашиот код.

- (void) parseXMLFileAtURL: (NSString *) УРЛ
{

NSString * agentString = @ "Mozilla / 5.0 (Windows NT 5.1;
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: барање за враќањеResponse: nil error: nil];


articles = [[NSMutableArray alloc] init];
errorParsing = НЕ;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: само];

// Можеби ќе треба да вклучите некои од нив во зависност од видот на XML-датотеката што ја анализирате
[rssParser setShouldProcessNamespaces: НЕ];
[rssParser setShouldReportNamespacePrefixes: НЕ];
[rssParser setShouldResolveExternalEntities: НЕ];

[rssParser разгледува];

}

Оваа функција му дава инструкции на моторот да преземе датотека на одредена веб-адреса (URL) и да го започне процесот за парсирање.

Го раскажуваме далечинскиот сервер дека сме Safari работи на Mac само во случај серверот да се обиде да го пренасочи iPhone / iPad на мобилната верзија.

Опциите на крајот се специфични за одредени XML-датотеки. Повеќето RSS-датотеки и генерички XML-датотеки нема да бидат вклучени.

- (празни) парсерот: (NSXMLParser *) парсерот parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Код за грешка% i", [parseError code]];
NSLog (@ "Грешка при парсирање на XML:% @", errorString);


errorParsing = ДА;
}

Ова е едноставно рутирање кое го проверува грешката кое ќе постави бинарна вредност ако се соочи со грешка. Можеби ќе треба нешто поспецифично тука, во зависност од тоа што правиш. Ако едноставно треба да извршите некој код по обработката во случај на грешка, тогаш може да се повика грешка променлива бинарна променлива.

- (void) парсерот: (NSXMLParser *) парсерот didStartElement: (NSString *) elementName namespaceURI: (NSString *) именски просторURI qualifiedName: (NSString *) qName атрибути: (NSDictionary *) attributeDict {
currentElement = [елемент Name copy];
ElementValue = [[NSMutableString alloc] init];
ако ([elementName еEqualToString: @ "елемент"])) {
item = [[NSMutableDictionary alloc] init];

}

}

Месото на XML парсерот содржи три функции, оние што се извршуваат на почетокот на поединечниот елемент, оној што се протега во средината на парсирање на елементот, и оној што работи на крајот на елементот.

За овој пример, ќе бидеме анализирани датотеки слични на RSS-датотеки кои ги раздвојуваат елементите во групи под насловот на "ставки" во рамките на XML-датотеката. На почетокот на обработката, ние го проверуваме името на елементот "item" и го доделуваме нашиот речник на предметот кога се открива нова група. Во спротивно, ја иницијализираме нашата променлива за вредноста.

- (неважечки) парсерот: (NSXMLParser *) пронајден парсеротCharacters: (NSString *) стринг {
[ElementValue appendString: стринг];
}

Ова е лесен дел. Кога наоѓаме карактери, едноставно ги додаваме во нашата променлива "ElementValue".

- (void) парсерот: (NSXMLParser *) парсерот неEndElement: (NSString *) елементИме имињапросторИРИ: (NSString *) именски просторURI qualifiedName: (NSString *) qName {
ако ([elementName еEqualToString: @ "елемент"])) {
[статии addObject: [item copy]];
} другото {
[item setObject: ElementValue forKey: elementName];
}

}

Кога ќе завршиме со обработка на елемент, треба да направиме една од две работи: (1) ако крајниот елемент е "ставка", ја завршивме нашата група, па ние ќе го додадеме речникот на нашиот низа "статии" ".

Или (2) ако елементот не е "ставка", ќе ја наместите вредноста во нашиот речник со клуч кој одговара на името на елементот. (Ова значи дека не ни треба индивидуална променлива за секое поле во XML-датотеката. Можеме да ги процесираме малку подинамично.)

- (void) parserDidEndDocument: (NSXMLParser *) парсерот {

ако (errorParsing == НЕ)
{
NSLog (@ "XML обработка направено!");
} другото {
NSLog (@ "Грешка настана при обработката на XML");
}

}

Ова е последната функција потребна за нашата рутинска анализа. Тоа едноставно го завршува документот. Ќе внесете код кој сакате да го завршите процесот овде или нешто посебно што можеби сакате да го направите во случај на грешка.

Едно нешто што многу апликации би сакале да направите тука е да ги зачувате податоците и / или XML датотеката во датотека на уредот. На тој начин, ако корисникот не е поврзан на Интернет, следниот пат кога ќе ја вчитаат апликацијата, тие сеуште можат да дојдат до оваа информација.

Се разбира, не можеме да го заборавиме најважниот дел: да ја раскажеме вашата апликација за анализирање на датотеката (и давање на него веб-адреса за да го најдете на!).

За да го започнете процесот, едноставно треба да ја додадете оваа линија на кодот до соодветното место каде што сакате да ја направите обработката на XML:

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