Iphone 使用NSXMLParser进行XML解析-我需要查看代码
我只需要确认我正在正确地进行XML解析。我做错什么了吗Iphone 使用NSXMLParser进行XML解析-我需要查看代码,iphone,objective-c,xml,xml-parsing,Iphone,Objective C,Xml,Xml Parsing,我只需要确认我正在正确地进行XML解析。我做错什么了吗 @interface RootViewController : UITableViewController <NSXMLParserDelegate> { NSXMLParser *parser; NSMutableArray *ordersList; BOOL orderIdFound; BOOL itemNameFound; BOOL priceFound;
@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);
}
}
@接口RootViewController:UITableViewController
{
NSXMLParser*解析器;
NSMutableArray*ordersList;
BOOL-orderIdFound;
BOOL-itemNameFound;
布尔-普莱斯发现;
BOOL-orderDateFound;
BOOL deliveryDateFound;
订单*订单对象;
}
@属性(非原子,保留)NSMutableArray*ordersList;
@属性(非原子,保留)NSXMLParser*解析器;
@属性(非原子,保留)顺序*orderObject;
@结束
@RootViewController的实现
@综合有序列表;
@综合语法分析器;
@合成有序对象;
-(无效)viewDidLoad
{
[超级视图下载];
ordersList=[[NSMutableArray alloc]init];
//读取本地XML文件
NSString*xmlFilePath=[[NSBundle mainBundle]pathForResource:@“orders”类型:@“xml”];
NSData*data=[[NSData alloc]initWithContentsOfFile:xmlFilePath];
parser=[[NSXMLParser alloc]initWithData:data];
parser.delegate=self;
[parser setShouldResolveExternalEntities:是];
[语法分析器解析];
}
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName属性:(NSDictionary*)attributeDict
{
if([elementName IsequalString:@“OrderId”])
{
orderIdFound=是;
if(orderObject==nil)
{
orderObject=[[Order alloc]init];
}
其他的
{
[ordersList addObject:orderObject];
[订单对象发布];
orderObject=nil;
orderObject=[[Order alloc]init];
}
}
如果([elementName IsequalString:@“ItemName”])
{
itemNameFound=是;
}
if([elementName IsequalString:@“Price”])
{
pricefind=是;
}
if([elementName IsequalString:@“OrderDate”])
{
orderDateFound=是;
}
如果([elementName IsequalString:@“DeliveryDate”])
{
deliveryDateFound=是;
}
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
{
if([elementName IsequalString:@“OrderId”])
{
orderIdFound=否;
}
如果([elementName IsequalString:@“ItemName”])
{
itemNameFound=否;
}
if([elementName IsequalString:@“Price”])
{
pricefind=否;
}
if([elementName IsequalString:@“OrderDate”])
{
orderDateFound=否;
}
如果([elementName IsequalString:@“DeliveryDate”])
{
deliveryDateFound=否;
}
}
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串{
如果(orderIdFound==是)
{
orderObject.OrderId=[string integerValue];
NSLog(@“orderId::%i”,orderObject.orderId);
}
如果(itemNameFound==是)
{
orderObject.ItemName=字符串;
NSLog(@“itemName::%@”,orderObject.itemName);
}
如果(priceFound==是)
{
Price=[string integerValue];
NSLog(@“价格::%i”,orderObject.price);
}
如果(orderDateFound==是)
{
orderObject.OrderDate=字符串;
NSLog(@“orderDate::%@”,orderObject.orderDate);
}
如果(deliveryDateFound==是)
{
orderObject.DeliveryDate=字符串;
NSLog(@“deliveryDate::%@”,orderObject.deliveryDate);
}
}
除了内存泄漏之外,它看起来基本正常。任何对alloc、new、copy或retain的调用都需要通过发布(例如在dealloc中)进行平衡
另外,我建议不要在视图控制器中进行XML解析。XML解析是一个独立的问题,适合分解成一个独立的类。运行代码时有问题吗?这似乎有效吗?您忘记了对retain的调用也需要释放。谢谢,我将在dealloc中释放解析器和其他对象。通常我最关心的代码是“if(orderObject==nil){orderObject=[[Order alloc]init];}else{[ordersList addObject:orderObject];[orderObject release];orderObject=nil;orderObject=[[Order alloc]init];}”我将把这个转移到单独的课堂:)谢谢,好的,我明白你想做什么了。XML是什么格式?从您的解析器来看,它看起来有点非结构化。您可以发布XML的示例吗?1 Hammer 5 2010年2月24日2010年2月28日11 Julia…顺便说一句,不要执行“[orderObject release];orderObject=nil;”而可以执行“self.orderObject=nil;”(因为该属性被保留)。整洁多了。