Разбор XML с использованием NSXML для iPhone - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть 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>

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

У меня есть это для разбора 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;
        }
    }
}

Но это получает только первую запись книг и ничего больше. Вместо установки флагов есть способ разбирать только между и теги?

Спасибо.

Ответы [ 2 ]

1 голос
/ 09 ноября 2011

Причина, по которой он получает только первый элемент, в том, что вы устанавливаете флаг в 2, когда видите конечный элемент для тега автора.Я подозреваю, что вы приблизитесь к тому, что хотите, если вы обновите этот флаг в конечном элементе для тега 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;
    }
  }
}
0 голосов
/ 09 ноября 2011

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

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

    ....
}
...