【问题标题】:XML Parsing with NSXMLParser - I need code review [closed]使用 NSXMLParser 进行 XML 解析 - 我需要代码审查 [关闭]
【发布时间】:2011-02-25 09:15:36
【问题描述】:

我只需要确认我正在正确地进行 XML 解析。我在这里做错了吗:

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

【问题讨论】:

  • 运行代码的时候有没有问题?好像有用吗?

标签: iphone objective-c xml xml-parsing


【解决方案1】:

它看起来一般没问题,除了你正在泄漏内存。任何对 alloc、new、copy 或 retain 的调用都需要与 release 平衡(例如在 dealloc 中)。

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

【讨论】:

  • 你忘记调用保留也需要释放。
  • 谢谢,我会在dealloc中释放解析器和其他对象。一般来说,我最关心这段代码 "if(orderObject == nil) { orderObject = [[Order alloc]init]; } else { [ordersList addObject:orderObject]; [orderObject release]; orderObject = nil; orderObject = [[ Order alloc]init]; }" 我会把它移到单独的类:) 谢谢
  • 啊,好吧,我明白你要做什么了。 XML 是什么格式?从您的解析器来看,它看起来有点非结构化。您可以发布 XML 示例吗?
  • 1Hammer 524/02/201028/02/201011Julia驱动程序> ...
  • 顺便说一句,而不是做“[orderObject release]; orderObject = nil;”相反,您可以执行“self.orderObject = nil;” (因为该属性被保留)。更整洁。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多