Читаем iOS. Приемы программирования полностью

Следующий метод называется parser: didStartElement: namespaceURI: qualifiedName: attributes:. В этом методе создадим корневой элемент (если он еще не создан). Когда в XML-файле начинается разбор любого нового элемента, мы вычисляем, где именно в структуре XML-файла находимся, а потом добавляем новый элемент-объект к актуальному элементу-объекту:


— (void) parser:(NSXMLParser *)parser

didStartElement:(NSString *)elementName

namespaceURI:(NSString *)namespaceURI

qualifiedName:(NSString *)qName

attributes:(NSDictionary *)attributeDict{


if (self.rootElement == nil){

/* У нас нет корневого элемента. Создадим такой элемент

и укажем на него. */

self.rootElement = [[XMLElement alloc] init];

self.currentElementPointer = self.rootElement;

} else {

/* Корневой элемент уже есть. Создаем новый элемент и добавляем его

в качестве одного из дочерних элементов текущего элемента. */

XMLElement *newElement = [[XMLElement alloc] init];

newElement.parent = self.currentElementPointer;

[self.currentElementPointer.subElements addObject: newElement];

self.currentElementPointer = newElement;

}


self.currentElementPointer.name = elementName;

self.currentElementPointer.attributes = attributeDict;


}


Теперь перед нами метод parser: foundCharacters:. Для каждого текущего элемента этот метод может вызываться несколько раз, поэтому необходимо гарантировать, что мы сможем сделать несколько записей в этом методе. Например, если текст элемента имеет 4000 символов в длину, то парсер может разобрать не более 1000 символов за первый ход, еще 1000 — за второй и т. д. В таком случае синтаксический анализатор вызовет метод parser: foundCharacters: для данного элемента четыре раза. Вероятно, вам потребуется просто аккумулировать результаты и вернуть их в виде строки:


— (void) parser:(NSXMLParser *)parser

foundCharacters:(NSString *)string{


if ([self.currentElementPointer.text length] > 0){

self.currentElementPointer.text =

[self.currentElementPointer.text stringByAppendingString: string];

} else {

self.currentElementPointer.text = string;

}


}


Следующий метод, с которым необходимо разобраться, называется parser: didEndElement: namespaceURI: qualifiedName:. Он вызывается, когда парсер доходит до конца элемента. Здесь нам нужно просто вернуть указатель XML-элементов на уровень выше, к тому элементу, который является родительским для только что проанализированного. Все довольно просто:


— (void) parser:(NSXMLParser *)parser

didEndElement:(NSString *)elementName

namespaceURI:(NSString *)namespaceURI

qualifiedName:(NSString *)qName{


self.currentElementPointer = self.currentElementPointer.parent;


}


И последний, но немаловажный момент. Нужно также обработать метод parserDidEndDocument: и избавиться от текущего свойства currentElementPointer:


— (void)parserDidEndDocument:(NSXMLParser *)parser{

self.currentElementPointer = nil;

}


Вот и все. Теперь можете выполнить синтаксический разбор нашего документа:


— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@"MyXML"

ofType:@"xml"];


NSData *xml = [[NSData alloc] initWithContentsOfFile: xmlFilePath];


self.xmlParser = [[NSXMLParser alloc] initWithData: xml];

self.xmlParser.delegate = self;

if ([self.xmlParser parse]){

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже