Как сделать выборочный анализ с NSXMLParser - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть следующий XML:

<data>
<title>Bookstore</title>
<site>www.bookstore.com</site>
<lastUpdate>11/17/2011</lastUpdate>
<books>
<unit>
<title>
Beginning iPhone 4 Development: Exploring the iOS SDK
</title>
<author>David Mark, Jack Nutting, Jeff LaMarche</author>
<isbn10>143023024X</isbn10>
<isbn13>978-1430230243</isbn13>
<pubDate>January 28, 2011</pubDate>
<price>23.99</price>
<description>
Beginning iPhone 4 Development is a complete course in iOS development. You'll master techniques that work on iPhone, iPad, and iPod touch. We start with the basics showing you how to download and install the tools you'll need, and how to create your first simple application. Next you'll learn to integrate all the interface elements iOS users have come to know and love, such as buttons, switches, pickers, toolbars, and sliders.
</description>
</unit>
<unit>...</unit>
<unit>...</unit>
</books>
<clothes>
<unit>
<title>T-Shirt</title>
<size>M</size>
<color>Red</color>
<price>10.99</price>
<description>
100% cotton T-shirt, wash in cold water with like colors
</description>
</unit>
<unit>...</unit>
<unit>...</unit>
<unit>...</unit>
</clothes>
<accessories>
<unit>
<title>Mug - Large</title>
<color>Black</color>
<price>6.99</price>
<description>
Large 16-ounce ceramic coffee mug, with witty use of IIT name on it.
</description>
</unit>
<unit>...</unit>
</accessories>
</data>

Это код, который я получил.Я проверяю, встречается ли тег «books».

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

    if([elementName isEqualToString:@"books"]) {

        appDelegate.books = [[NSMutableArray alloc] init];

    }

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

        aBook = [[Book alloc] init];
    }

    NSLog(@"Processing Element: %@", elementName);
}

.

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

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

    NSLog(@"Processing Value: %@", currentElementValue);

}

Здесь я пытаюсь присвоить значения в каждом теге переменной в объекте Book.

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

    if (qName) {
        elementName = qName;
    }       
    if (aBook) {            

    if ([elementName isEqualToString:@"title"]) {
        aBook.title = currentElementValue;
    } else if ([elementName isEqualToString:@"author"]) {
        aBook.author = currentElementValue;
    } else if ([elementName isEqualToString:@"isbn10"]) {
        aBook.isbn10 = currentElementValue;
    } else if ([elementName isEqualToString:@"isbn13"]) {
        aBook.isbn13 = currentElementValue;
    } else if ([elementName isEqualToString:@"pubDate"]) {
        aBook.pubDate = currentElementValue;

    } else if ([elementName isEqualToString:@"price"]) {
        aBook.price = currentElementValue;
    } else if ([elementName isEqualToString:@"description"]) {
        aBook.description = currentElementValue;
    }

        [appDelegate.books addObject:aBook];

        [aBook release];
        aBook = nil;    

    }

    [currentElementValue release];
    currentElementValue = nil;
}

У меня есть UITableView для отображения списка книг,

Book *aBook = [appDelegate.books objectAtIndex:indexPath.row];
    [[cell textLabel] setText:[aBook title]];

Проблема в том, что все элементы отображаются в виде таблицы, а не только книги.Как мне ограничить отображаемые предметы только из книг.Я думаю, что я ошибаюсь в методе Parser DidStartElement.

Спасибо.

1 Ответ

0 голосов
/ 21 ноября 2011

В parser:didEndElement:namespaceURI:qualifiedName: вам нужно проверить тег </books> и игнорировать любой тег <unit> после этого.

Один из способов сделать это - использовать self.books вместо appDelegate.books внутри парсера, и только тогда, когда вы достигнете тега </books>, установите appDelegate.books на self.books, а затем установите self.books на ноль.Если вы достигнете тега <unit> и self.books равен нулю, вы игнорируете единицу.

...