#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 Я думаю, что что-то еще не так, как вы сказали. Но, как сказал Тим, это работает только для книг, а не для остальных.