Следующий метод называется 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]){