Синтаксический анализ XML с использованием NSXML для iPhone

#objective-c #ios4 #nsxmlparser

#objective-c #ios4 #nsxmlparser

Вопрос:

У меня есть XML, который имеет структуру, подобную этой:

 <data>
   <books>
      <item>
          <title>book1</title>
          <author>author1</author>
      </item> 
      <item>
          <title>book2</title>
          <author>author2</author>
      </item>
   </books>
   <magazines>
      <item>
          <title>Mag1</title>
          <author>author1</author>
      </item>
   </magazines>
   <journals>
      <item>
          <title>Journal1</title>
          <author>author1</author>
      </item> 
      <item>
          <title>Journal2</title>
          <author>author2</author>
      </item>
   </journals>
</data>
  

Я использую табличное представление для отображения элементов каждой категории. Я планирую иметь табличное представление со столбцами книги, журналы amp; journals, и при нажатии на них должны отображаться только элементы под ними. То есть, если я нажимаю на книги, должны отображаться только записи в книге.

У меня есть это для синтаксического анализа xml

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

    if ([elementName isEqual:@"books"]) {
        flag=1;
    }   

    if ([elementName isEqual:@"title"]) {   
        NSLog(@"found title!");
        parsedString = [[NSMutableString alloc] init];
    }
    if ([elementName isEqual:@"author"]) {  
        NSLog(@"description found");
        parsedString = [[NSMutableString alloc] init];
    }

}
  

и в

 - (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    if (flag==1){   
    if ([elementName isEqual:@"title"]) {
        [headlines addObject:parseString];

        [parseString release];
        parseString = nil;
    }

    if ([elementName isEqual:@"author"]) {
        [authors addObject:parsedString];
        [parseString release];
        parseString = nil;
        flag=2;
        }
    }
}
  

Но при этом отображается только первая запись books и ничего больше.
Есть ли способ вместо установки флагов выполнять синтаксический анализ только между <books> и
теги </books> ?

Спасибо.

Ответ №1:

Причина, по которой он получает только первый элемент, заключается в том, что вы устанавливаете флаг равным 2, когда видите конечный элемент для тега author. Я подозреваю, что вы приблизитесь к желаемому, если обновите этот флаг в конечном элементе тега books следующим образом:

 - (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
  if (flag==1){   
    if ([elementName isEqual:@"title"]) {
        [headlines addObject:parseString];

        [parseString release];
        parseString = nil;
    }

    if ([elementName isEqual:@"author"]) {
        [authors addObject:parsedString];
        [parseString release];
        parseString = nil;
    }
    if ([elementName isEqual:@"books"]) {
        flag=2;
    }
  }
}
  

Ответ №2:

Просто отмените синтаксический анализ, когда закончится тег books:

 - (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{  
    if ([elementName isEqual:@"books"]) {
        [parser abortParsing];
    }

    ....
}
  

Комментарии:

1. Этот подход будет работать только в том случае, если вы пытаетесь получить раздел books, который случайно находится первым в XML, как в примере. Но если вы хотите применить ту же логику для извлечения разделов «журналы» и «journals», это не сильно поможет.

2. Я попробовал это сейчас. В ячейках моего tableview при нажатии появляется экран, на котором отображается имя автора. Это работает нормально, но когда я возвращаюсь к просмотру таблицы и снова нажимаю на элемент, происходит сбой. По сути, то, что я пытаюсь сделать, это анализировать только теги в книгах, анализировать только теги в журналах и т.д. Итак, в случае, если я разбираю журналы, он не должен разбирать теги в разделе книги и журналы.

3. @RBK — это еще одна проблема, вероятно, не связанная с синтаксическим анализом.

4. @Max Я думаю, что что-то еще не так, как вы сказали. Но, как сказал Тим, это работает только для книг, а не для остальных.