2015-08-17 3 views
0

Я новичок в разработке iOS. Я хочу проанализировать мой массив веб-сервисов xml. Мой ответ XML, как,Как анализировать массив xml в iOS с помощью xmlParser

<BookList> 
    <Book> 
      <BookID>int</BookID> 
      <BookName>string</BookName> 
      <Pages>string</Pages> 
      <Price>string</Price> 
    </Book> 
    <Book> 
      <BookID>int</BookID> 
      <BookName>string</BookName> 
      <Pages>string</Pages> 
      <Price>string</Price> 
    </Book> 
</BookList> 

Вот код, я использую для анализа ответа,

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSString *theXML = [[NSString alloc] initWithBytes: 
         [self.webResponseData mutableBytes] length:[self.webResponseData length] encoding:NSUTF8StringEncoding]; 

    //now parsing the xml 
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData: self.webResponseData]; 
    xmlParser.delegate = self; 

    // Run the parser 
    @try{ 
     BOOL parsingResult = [xmlParser parse]; 
    } 
    @catch (NSException* exception) 
    { 
     UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Server Error" message:[exception reason] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
     [alert show]; 
     return; 
    } 
} 

//Implement the NSXmlParserDelegate methods 
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName: 
(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    currentElement = elementName; 
} 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    // NSLog(@"String : %@", string); 
    if ([currentElement isEqualToString:@"BookID"]) { 
     NSLog(@"BookID : %@", string); 
    }else if ([currentElement isEqualToString:@"BookName"]) { 
     NSLog(@"BookName : %@", string); 
    }else if ([currentElement isEqualToString:@"Pages"]) { 
     NSLog(@"Pages : %@", string); 
    }else if ([currentElement isEqualToString:@"Price"]) { 
     NSLog(@"Price : %@", string); 
    } 

} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    // NSLog(@"Current Element: %@ ",currentElement); 
} 

Используя этот код можно просмотреть результаты, но я могу получить количество книг.

ответ

1

Вы можете добавить это к файл .h

NSMutableDictionary *dictBook; 
NSMutableArray *arrBook; 
NSMutableString *elementValue; 

Теперь используйте следующий код, чтобы получить общее количество счетчиков книг.

//Implement the NSXmlParserDelegate methods 
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName: 
(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    currentElement = elementName; 
    if ([currentElement isEqualToString:@"BookList"]) { 
     arrBook = [[NSMutableArray alloc] init]; 
    } 
    else if ([currentElement isEqualToString:@"Book"]) { 
     dictBook = [[NSMutableDictionary alloc] init]; 
    } 
} 


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    if(!elementValue) 
     elementValue = [[NSMutableString alloc] initWithString:string]; 
    else 
     elementValue = string; //[elementValue appendString:string]; 

    NSLog(@"elementValue : %@",elementValue); 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    // NSLog(@"Current Element: %@ ",currentElement); 

    if ([elementName isEqualToString:@"BookID"] || 
     [elementName isEqualToString:@"BookName"] || 
     [elementName isEqualToString:@"Pages"] || 
     [elementName isEqualToString:@"Price"]) 
    { 
     [dictBook setObject:elementValue forKey:elementName]; 
    } 
    else if ([elementName isEqualToString:@"Book"]) 
    { 
     [arrBook addObject:dictBook]; 
    } 

    // [elementValue setString:@""]; 
} 

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    NSLog(@"Arr Book Count : %lu", (unsigned long)arrBook.count); 

} 

Надеюсь, это вам поможет.

+0

@Bkjadev Здесь я получаю счет как правильно, но когда я печатаю массив как, - (void) parserDidEndDocument: (NSXMLParser *) парсер {NSLog (@ "Количество подписчиков:% lu", (unsigned long) arrBook.count); NSLog (@ "Book Array:% @", arrBook); } Мой журнал похож: Количество подписчиков: 2 Книга: "; Pages =" "; Price =" ";}) - –

+0

Удалить одну строку == [elementValue setString: @" "]; из функции didEndElement – BKjadav

+1

Я изменил «[elementValue appendString: string];» to elementValue = строка; также также прокомментировал «[elementValue setString: @" "];". Теперь его Работа. Благодарю. –

Смежные вопросы