Макар и вграден XML parser добавя реална стойност към ново настолно или мобилно приложение, като кодирането на тази функционалност обикновено изисква много време за разработка и бета тестване. Програмата Xcode на Apple включва XML парсер, който заобикаля по-голямата част от тази ръчна работа.
An XML файлът може да съдържа всичко - от основни данни за вашето приложение до RSS емисия за уебсайт. Те също могат да бъдат чудесен начин за актуализиране на информация в приложението ви от разстояние, като по този начин се заобикаля необходимостта от изпращане на нов двоичен файл на Apple, просто за добавяне на нов елемент в списък.
Процесът на Xcode
Вграденият Xcode процес съдържа стъпки за инициализиране на променливите, които ще се използват, стартиране на процеса на XML парсер, подаване на този процес на файл, оценка на отделни елементи и знаци (стойност) в тези елементи, разпознаване на края на отделен елемент и прекратяване на синтактичния анализ процес.
Използвайте XML парсер
За да илюстрираме подробностите, ще анализираме примерен файл от интернет, като му предадем определен уеб адрес (
URL).Започнете с изграждането на заглавния файл. Това е пример за много основен заглавен файл за Detail View Controller с минималните изисквания за анализиране на нашия файл:
@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;
NSXMLParser * rssParser;
NSMutableArray * статии;
NSMutableDictionary * артикул;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL грешкаРазбиране;
}
@property (неатомично, запазване) IBOutlet DetailViewController * detailViewController;
- (void) parseXMLFileAtURL: (NSString *) URL;
Функцията parseXMLFileAtURL стартира процеса. Когато приключи, "статиите" на NSMutableArray съдържат данните. Масивът се състои от променливи речници с ключове, свързани с имената на полетата в XML файла.
След това инициализирайте процеса:
- (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]];
[заявка setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: заявка returnResponse: грешка нула: нула];
статии = [[NSMutableArray alloc] init];
errorParsing = НЕ;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: самостоятелно];
// Може да се наложи да включите някои от тях в зависимост от типа XML файл, който анализирате
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser parse];
}
Тази функция инструктира двигателя да изтегли файл на определен уеб адрес (URL) и да започне процеса на неговия анализ. Казваме на отдалечения сървър, че сме Safari, работещ на Mac, в случай че сървърът се опита да пренасочи iPhone / iPad към мобилна версия.
Опциите в края са специфични за определени XML файлове. Повечето RSS файлове и общи XML файлове няма да се нуждаят от тях.
Проверете грешката в резултата
Извършете някои основни проверки на грешки на резултата:
- (void) парсер: (NSXMLParser *) парсер parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Код на грешка% i", [parseError код]];
NSLog (@ "Грешка при синтактичния анализ на XML:% @", errorString);
errorParsing = ДА;
} Това маршрутизиране за проверка на грешки задава двоична стойност, ако срещне грешка. Тук може да се нуждаете от нещо по-конкретно в зависимост от това, което правите. Ако просто трябва да стартирате някакъв код след обработка в случай на грешка,
Тази процедура за проверка на грешки задава двоична стойност, ако срещне грешка. Тук може да се нуждаете от нещо по-конкретно в зависимост от това, което правите. Ако просто трябва да стартирате някакъв код след обработка в случай на грешка, бинарната променлива за синтактичен анализ може да бъде извикана по това време.
Анализирайте извлеченото съдържание
След това програмата разбива изтегленото съдържание и го анализира:
- (void) парсер: (NSXMLParser *) парсер didStartElement: (NSString *) elementName пространство на имеURI: (NSString *) пространство на имеURI qualiName: (NSString *) qName атрибути: (NSDictionary *) attributeDict {
currentElement = [copyName copy];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString: @ "item"]) {
елемент = [[NSMutableDictionary alloc] init];
}
}
Месото на XML парсера съдържа три функции, едната, която се изпълнява в началото на даден индивид елемент, който се изпълнява в средата на синтактичния анализ на елемента, и такъв, който се изпълнява в края на елемент.
За този пример ще анализираме файл, подобен на RSS файловете, който разделя елементи на групи под заглавието на елементи в XML файла. В началото на обработката проверяваме за името на елемента "item" и разпределяме нашия речник на артикули, когато бъде открита нова група. В противен случай инициализираме нашата променлива за стойността:
- (void) парсер: (NSXMLParser *) намерен парсер Характери: (NSString *) низ {
[ElementValue appendString: низ];
}
Когато намерим символи, ние просто ги добавяме към нашата променлива ElementValue:
- (void) парсер: (NSXMLParser *) парсер didEndElement: (NSString *) elementName пространство на имеURI: (NSString *) пространство на имеURI qualiName: (NSString *) qName {
if ([elementName isEqualToString: @ "item"]) {
[статии addObject: [копие на артикул]];
} друго {
[item setObject: ElementValue forKey: elementName];
}
}
Какво се случва, когато разборът е завършен
Когато програмата завърши обработката на елемент, тя трябва да направи едно от двете неща:
- Ако крайният елемент е вещ, завършихме нашата група, така че ще добавим нашия речник към нашия набор от статии.
- Ако елементът не е вещ, ще зададем стойността в нашия речник с ключ, който съответства на името на елемента. (Това означава, че не се нуждаем от индивидуална променлива за всяко поле в XML файла. Можем да ги обработим малко по-динамично.)
Това е последната функция, необходима за нашата рутина за синтактичен анализ; той завършва документа. Поставете тук какъвто и да е окончателен код или посочете подпрограма за коригиране на грешки:
- (void) parserDidEndDocument: (NSXMLParser *) парсер {
ако (errorParsing == НЕ)
{
NSLog (@ "XML обработка завършена!");
} друго {
NSLog (@ "Възникна грешка по време на XML обработка");
}
}
Запазете данните
Едно нещо, което много приложения може да искат да направят тук, е да запишат данните или XML файла във файл на устройството. По този начин, ако устройството не е свързано с интернет при следващото зареждане на приложението, то все още може да получи тази информация.
Разбира се, не можем да забравим най-важната част: да кажете на приложението си да анализира файла (и да му дадете уеб адрес, за да го намерите!). За да стартирате процеса, добавете този ред код на подходящото място, където искате да направите XML обработката:
[self parseXMLFileAtURL: @ " http://www.webaddress.com/file.xml"];