【问题标题】:How parse xml array in iOS using xmlParser如何在 iOS 中使用 xmlParser 解析 xml 数组
【发布时间】:2015-11-10 01:32:02
【问题描述】:

我是 iOS 开发新手。我想解析我的 xml web 服务数组。我的 xml 响应是这样的,

 <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);
}

使用这段代码我可以查看结果,但我可以得到书的数量。

【问题讨论】:

    标签: ios xml xml-parsing nsxmlparser


    【解决方案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);
    
    }
    

    希望这会对你有所帮助。

    【讨论】:

    • @Bkjadev 在这里我得到了正确的计数,但是当我打印数组时, - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"Arr Book Count : %lu" , (unsigned long)arrBook.count); NSLog(@"Book Array : %@", arrBook); } 我的日志就像,Arr Book Count : 2 Book Array : ( { BookID = ""; BookName = ""; Pages = ""; Price = ""; }, { BookID = ""; BookName = ""; Pages = ""; 价格 = ""; } ) –
    • 删除一行 == [elementValue setString:@""];来自 didEndElement 函数
    • 我已更改“[elementValue appendString:string];”到元素值 = 字符串;还评论了“[elementValue setString:@”“];”。现在它的工作。谢谢。
    猜你喜欢
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多