Разбор XML без атрибута и отображение его в UITableView в программировании iPhone - PullRequest
0 голосов
/ 15 января 2010

Я новичок в программировании приложений iPhone. Я не могу получить значение из файла XML и отобразить его в UITableView. Мне нужно узнать имя животного. Как простой способ разобрать XML без атрибута? Я прочитал документацию NSXMLParser, но данные не отображаются в моем UITableView. Вот мой XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<animals>
  <animal>
    <id>1</id>
    <name>Elephant</name>
  </animal>
  <animal>
    <id>2</id>
    <name>Tiger</name>
  </animal>
  <animal>
    <id>3</id>
    <name>Bird</name>
  </animal>
</animals>

Я следую некоторому руководству по синтаксическому анализу XML с атрибутом, но в моем файле XML у меня нет атрибута. И вот мой код для разбора XML:

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
     attributes:(NSDictionary *)attributeDict {

     if([elementName isEqualToString:@"animals"]) {
      appDelegate.animals = [[NSMutableArray alloc] init];
     }

     else if([elementName isEqualToString:@"animal"]) {  
     }

        else if([elementName isEqualToString:@"id"]){
      aAnimal = [[Animal alloc] init];
      aAnimal.animalID = elementName;
     } 
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

     if(!currentElementValue) 
      currentElementValue = [[NSMutableString alloc] initWithString:string];
     else
      [currentElementValue appendString:string]; 
    }

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

     if([elementName isEqualToString:@"animals"])
      return;
     else if([elementName isEqualToString:@"animal"]) {
     }
        else if([elementName isEqualToString:@"id"]) {
      [appDelegate.animals addObject:aAnimal];      
      [aAnimal release];
      aAnimal = nil;
     }
     else 
      [aAnimal setValue:currentElementValue forKey:elementName];

     [currentElementValue release];
     currentElementValue = nil;
    }

Ответы [ 2 ]

0 голосов
/ 03 марта 2010

Как уже упоминалось в ReaddyEddy, вам нужно сохранить текущую строку, установив делегат parser foundCharacters. Так должно выглядеть примерно так:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
    // currentStringValue is an NSMutableString instance variable
    currentStringValue = [[NSMutableString alloc] initWithCapacity:50] ; // +1
}

NSString *tempString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([tempString length] > 0) {
    [currentStringValue appendString:tempString] ;
}

}

тогда в вашем парсере didEndElement вам нужно проверить имя элемента, чтобы оно соответствовало вашему желаемому тегу. затем сохраните значение currentStringValue:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ( [elementName isEqualToString:@"id"]) {
    self.id = currentStringValue ;
}

if ( [elementName isEqualToString:@"name"]) {
    self.name = currentStringValue ;
}

}

что я обычно делаю, так это помещаю foundCharacters в класс baseModel.m. Тогда у меня все остальные модели унаследованы от него. И каждое наследование просто реализует свой синтаксический анализатор didEndElement. В вашем случае с животными и животными у меня также было бы две модели, одна с животными и одна с животными, а в Animals.m я бы искал тег Animal, а затем создал объект Animal (как то, что вы там делали), но тогда я просто установил бы делегат для вновь созданного объекта Animal и позволил модели Animal обрабатывать свой собственный анализ. Однако, если вы это сделаете, вам нужно проверить конечные теги для каждого и установить делегата обратно в родительский.

0 голосов
/ 06 февраля 2010

Довольно распространенная проблема; пример решения - CocoaXMLParser в примере Apple XMLPerformance, который отвечает на вопрос. По сути, определите логическое значение для управления сбором символьных данных и строку для ее хранения, убедитесь, что строка где-то инициализирована.

Включить коллекцию персонажей в: - (void) парсер: (NSXMLParser *) парсер didStartElement Создайте свою переменную в:

  • (void) парсер: (NSXMLParser *) парсер didEndElement

Собирайте символы в:

  • (void) парсер: (NSXMLParser *) парсер найденХарактеры: (NSString *) строка { if (storingCharacters) [currentString appendString: string]; }
...