2011-02-25 32 views
-1

我只需要确认我正在做XML解析权。我在这里做错了什么:XML解析NSXMLParser - 我需要代码审查

@interface RootViewController : UITableViewController <NSXMLParserDelegate> 
{ 
    NSXMLParser *parser;  
    NSMutableArray *ordersList; 

    BOOL orderIdFound; 
    BOOL itemNameFound; 
    BOOL priceFound; 
    BOOL orderDateFound; 
    BOOL deliveryDateFound; 

    Order *orderObject; 
} 

@property (nonatomic, retain) NSMutableArray *ordersList; 
@property (nonatomic, retain) NSXMLParser *parser; 
@property (nonatomic, retain) Order *orderObject; 

@end 


@implementation RootViewController 

@synthesize ordersList; 
@synthesize parser; 
@synthesize orderObject; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ordersList = [[NSMutableArray alloc]init]; 

    // Reading local XML file 
    NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@"orders" ofType:@"xml"]; 

    NSData *data = [[NSData alloc]initWithContentsOfFile:xmlFilePath]; 
    parser = [[NSXMLParser alloc]initWithData:data]; 
    parser.delegate = self; 
    [parser setShouldResolveExternalEntities:YES]; 
    [parser parse]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{  
    if ([elementName isEqualToString:@"OrderId"]) 
    {   
     orderIdFound = YES; 
     if(orderObject == nil) 
     { 
      orderObject = [[Order alloc]init]; 
     } 
     else 
     { 
      [ordersList addObject:orderObject]; 

      [orderObject release]; 
      orderObject = nil; 
      orderObject = [[Order alloc]init]; 
     } 
    } 
    if ([elementName isEqualToString:@"ItemName"]) 
    { 
     itemNameFound = YES; 
    } 
    if ([elementName isEqualToString:@"Price"]) 
    { 
     priceFound = YES; 
    } 
    if ([elementName isEqualToString:@"OrderDate"]) 
    { 
     orderDateFound = YES; 
    } 
    if ([elementName isEqualToString:@"DeliveryDate"]) 
    { 
     deliveryDateFound = YES; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{  
    if([elementName isEqualToString:@"OrderId"]) 
    { 
     orderIdFound = NO;  
    } 
    if([elementName isEqualToString:@"ItemName"]) 
    { 
     itemNameFound = NO;  
    } 
    if([elementName isEqualToString:@"Price"]) 
    { 
     priceFound = NO;   
    } 
    if([elementName isEqualToString:@"OrderDate"]) 
    { 
     orderDateFound = NO;   
    } 
    if([elementName isEqualToString:@"DeliveryDate"]) 
    { 
     deliveryDateFound = NO; 
    } 
} 

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

    if(orderIdFound == YES) 
    { 
     orderObject.OrderId = [string integerValue]; 
     NSLog(@"orderId :: %i", orderObject.OrderId); 

    } 
    if(itemNameFound == YES) 
    {  
     orderObject.ItemName = string; 
     NSLog(@"itemName :: %@", orderObject.ItemName); 
    } 
    if(priceFound == YES) 
    {  
     orderObject.Price = [string integerValue]; 
     NSLog(@"price :: %i", orderObject.Price); 
    } 
    if(orderDateFound == YES) 
    {  
     orderObject.OrderDate = string; 
     NSLog(@"orderDate :: %@", orderObject.OrderDate); 
    } 
    if(deliveryDateFound == YES) 
    {  
     orderObject.DeliveryDate = string; 
     NSLog(@"deliveryDate :: %@", orderObject.DeliveryDate); 
    } 
} 
+0

当你运行代码时你有问题吗?它似乎工作? – occulus 2011-02-25 09:37:12

回答

2

它看起来总体上没问题,只是你正在泄漏内存。任何分配,新增,复制或保留的调用都需要与一个版本(例如dealloc)进行平衡。

另外,我建议不要在视图控制器中进行XML解析。 XML解析是一个单独的问题,适合于分解为单独的类。

+1

你忘记了保留需要释放的呼叫了。 – Jasarien 2011-02-25 09:43:54

+0

谢谢,更正。 – occulus 2011-02-25 09:46:32

+0

谢谢,我将在dealloc中释放解析器和其他对象。一般我是这个代码最关注的“如果(orderObject ==无) { orderObject = [订单分配]初始化];} 其他 { [ordersList ADDOBJECT:orderObject]; [orderObject发布]; orderObject = nil; orderObject = [[Order alloc] init]; }“ 我将把这个移动到单独的类:)谢谢 – 1110 2011-02-25 09:48:33