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

Една проста задача, която е гръбнакът на много приложения, е способността да се анализират XML файлове. И, за щастие, Xcode прави относително лесно да се анализира XML файл в Objective-C.

XML файлът може да съдържа всичко от основните данни за приложението ви до RSS емисия за даден уебсайт. Те също така могат да бъдат чудесен начин за дистанционно актуализиране на информацията в приложението ви, като по този начин се избегне необходимостта от подаване на нова двоична информация за Apple, за да се добави нов елемент в списък.

Така че как да обработим XML файлове в Xcode? Процесът съдържа стъпки за инициализиране на променливите, които ще се използват, стартиране на процеса на синхронизиране на XML, захранване на този процес с файл, стартиране на отделен елемент, знаците (стойност) края на отделен елемент и края на процеса на синтактичен анализ.

В този пример ще анализираме файл от Интернет, като го предаваме на конкретен уеб адрес ( URL адрес ).

Ще започнем с изграждането на заглавния файл. Това е пример за много основен заглавен файл за контролер за подробно показване с минималните изисквания за анализ на файла ни:

@ интерфейс RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * статии;
NSMutableDictionary * елемент;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (неатомно, задържане) IBOutlet DetailViewController * detailViewController;

- (невалиден) parseXMLFileAtURL: (NSString *) URL;

Функцията parseXMLFileAtURL ще стартира процеса за нас. Когато тя завърши, NSMutableArray "статиите" ще задържат нашите данни. Масивът ще бъде съставен от речници с възможност за преобразуване с ключове, свързани с имената на полетата в XML файла.

Сега, след като сме настроили необходимите променливи, ще преминем към изпълнението на процеса в .m файла:

- (void) parserDidStartDocument: (NSXMLParser *) анализатор {
NSLog (@ "Намерен файл и стартиране на анализа");

}

Тази функция работи в началото на процеса. Не е необходимо да поставяте нищо в тази функция, но ако искате да изпълнявате задача, когато файлът започне да се анализира, това е мястото, където ще поставите кода си.

- (void) 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) Версия / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[request setValue: agentString заHTTPHeaderField: @ "Потребител-агент"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: нулева грешка: нула];


статии = [[NSMutableArray разпределение] начало];
errorParsing = NO;

rssParser = [[NSXMLParser разпределение] initWithData: xmlFile];
[rssParser setDelegate: self];

// Може да се наложи да включите някои от тях в зависимост от вида на XML файла, който анализирате
[rssParser setShouldProcessNamespaces: НЕ];
[rssParser setShouldReportNamespacePrefixes: НЕ];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Тази функция инструктира двигателя да изтегли файл на определен уеб адрес (URL) и да стартира процеса за неговия анализ.

Ние казваме на отдалечения сървър, че ние сме Safari, работещ на Mac, само ако сървърът се опита да пренасочи iPhone / iPad към мобилна версия.

Опциите в края са специфични за определени XML файлове. Повечето RSS файлове и генерични XML файлове няма да се нуждаят от включване.

- (невалиден) анализатор: (NSXMLParser *) parserErrorOccurred: (NSError *) parseError {

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


errorParsing = YES;
}

Това е просто проследяване на грешките, което ще определи бинарна стойност, ако срещне грешка. Може да се нуждаете от нещо по-конкретно тук в зависимост от това, което правите. Ако в случай на грешка просто трябва да изпълните код след обработка, двойната променлива errorParsing може да бъде извикана по това време.

- (невалиден) анализатор: (NSXMLParser *) анализатор didStartElement: (NSString *) елементName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName атрибути:
currentElement = [копие елементName];
ЕлементValue = [[NSMutableString alloc] начало];
ако ([elementName isEqualToString: @ "item"]) {
елемент = [[NSMutableDictionary alloc] init];

}

}

Месото на анализатора на XML съдържа три функции - това, което се изпълнява в началото на отделен елемент, този, който се изпълнява по време на анализа на елемента и този, който се изпълнява в края на елемента.

За този пример ще анализираме файл, подобен на RSS файловете, който разбива елементи в групи под заглавието "елементи" в XML файла. В началото на обработката проверяваме името на елемента "елемент" и разпределяме речника на елемента си, когато бъде открита нова група. В противен случай, ние инициализираме нашата променлива за стойността.

- (void) анализатор: (NSXMLParser *) parser foundCharacters: (NSString *) низ {
[ElementValue appendString: низ];
}

Това е лесната част. Когато открием символи, просто ги добавим към нашата променлива "ElementValue".

(NSString *) елементName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
ако ([elementName isEqualToString: @ "item"]) {
[articles addObject: [копие на елемента]];
} else {
[елемент setObject: ElementValue заKey: elementName];
}

}

Когато приключим с обработката на елемент, трябва да направим едно от следните две неща: (1) ако крайният елемент е "елемент", завършихме нашата група, така че ще добавим нашия речник към нашата гама от "статии" ".

Или (2) ако елементът не е "елемент", ще зададем стойността в нашия речник с ключ, който съответства на името на елемента. (Това означава, че нямаме нужда от индивидуална променлива за всяко поле в XML файла. Можем да ги обработим малко по-динамично.)

- (void) parserDidEndDocument: (NSXMLParser *) анализатор {

ако (errorParsing == NO)
{
NSLog (@ "XML обработката е извършена!");
} else {
NSLog (@ "Грешка при обработката на XML");
}

}

Това е последната функция, необходима за рутината ни за разглеждане. Тя просто прекратява документа. Вие ще поставите кода, който искате да завършите процеса тук или нещо специално, което може да искате да направите в случай на грешка.

Едно нещо, което много приложения биха могли да направят тук, е да запазят данните и / или XML файла във файл на устройството. По този начин, ако потребителят не е свързан към интернет при следващото натоварване на приложението, той все още може да получи тази информация.

Разбира се, не можем да забравим и най-важната част: да кажем на вашето приложение да анализира файла (и да му даде уеб адрес, за да го намери!).

За да започнете процеса, просто трябва да добавите този ред код към подходящото място, където искате да направите XML обработката:

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