objective-c XML解析

[size=medium]最近项目用到了从服务器获取xml文件,需要解析xml来获取数据,下面简单举个例子,以便自己以后学习并复习。另外[url]http://www.w3school.com.cn/xpath/xpath_examples.asp[/url]上有一些例子,有兴趣的同学可以去看看xml的相关知识。

从服务器上下载的xml文件:[/size]
<?xml version="1.0" encoding="utf-8"?>
<page>
<ROWSET>
<ROW num="1"><!-- 订单1 -->
<ORDERNO>C1007260000037</ORDERNO><!-- 订单号,选填 -->
<STATUS>E</STATUS><!-- 订单状态 -->
<TOTALPAYMONEY>6810</TOTALPAYMONEY><!-- 订单总价 -->
<CREATEDATE>2010-07-26</CREATEDATE><!-- 订单创建日期 -->
<CAMPAIGNSCRIPTID>6</CAMPAIGNSCRIPTID><!-- 订单类型标识 -->
<SEGINFO><!-- 订单航段 -->
<SEGINFO_ROW num="1"><!-- 订单航段1 -->
<CARRIER>CZ</CARRIER>
<DEPCODE>CAN</DEPCODE>
<ARRCODE>PEK</ARRCODE>
<DEPPORT> 广州</DEPPORT>
<ARRPORT> 北京</ARRPORT>
<CARRIER>CZ</CARRIER>
<FLIGHTNO>3107</FLIGHTNO>
<DEPTIME>2010-07-28</DEPTIME>
<ARRTIME>2010-07-28</ARRTIME>
</SEGINFO_ROW>
<SEGINFO_ROW num="2"><!-- 订单航段2 -->
<CARRIER>CZ</CARRIER>
<DEPCODE>PEK</DEPCODE>
<ARRCODE>CAN</ARRCODE>
<DEPPORT> 北京</DEPPORT>
<ARRPORT> 广州</ARRPORT>
<CARRIER>CZ</CARRIER>
<FLIGHTNO>3104</FLIGHTNO>
<DEPTIME>2010-07-29</DEPTIME>
<ARRTIME>2010-07-29</ARRTIME>
</SEGINFO_ROW>
</SEGINFO>
</ROW>
<ROW num="2">
<ORDERNO>C1007260000034</ORDERNO>
<DOMESTICINDICATE>1</DOMESTICINDICATE>
<STATUS>C</STATUS>
<TOTALPAYMONEY>2010</TOTALPAYMONEY>
<CREATEDATE>2010-07-26</CREATEDATE>
<CAMPAIGNSCRIPTID>6</CAMPAIGNSCRIPTID>
<SEGINFO>
<SEGINFO_ROW num="1">
<CARRIER>CZ</CARRIER>
<DEPCODE>CAN</DEPCODE>
<ARRCODE>PEK</ARRCODE>
<DEPPORT> 广州</DEPPORT>
<ARRPORT> 北京</ARRPORT>
<CARRIER>CZ</CARRIER>
<FLIGHTNO>3107</FLIGHTNO>
<DEPTIME>2010-07-28</DEPTIME>
<ARRTIME>2010-07-28</ARRTIME>
</SEGINFO_ROW>
</SEGINFO>
</ROW>
</ROWSET>
</page>


[size=medium]上面的xml中主要需要两个循环,一个:ROWSET下的ROW节点 ,一个是:SEGINFO下的SEGINFO_ROW节点
UserOrder *orderObj 自己定义的数据结构,用来存放xml数据[/size]

//初始化数据源,从(NSData*)aData参数中
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:aData options:0 error:&error];

NSMutableArray *orderArray = [[NSMutableArray alloc] initWithCapacity:2];

NSArray *orders = [doc nodesForXPath:@"//ROW" error:aError];//循环ROW节点
for (GDataXMLElement *order in orders) {

UserOrder *orderObj = [[UserOrder alloc] init];

//获取ROW节点下节点数据
orderObj.orderNo = [order stringForTextNodeNamed:@"ORDERNO"];
orderObj.status = [order stringForTextNodeNamed:@"STATUS"];
orderObj.price = [order stringForTextNodeNamed:@"TOTALPAYMONEY"];
orderObj.date = [order stringForTextNodeNamed:@"CREATEDATE"];
orderObj.orderType = [order stringForTextNodeNamed:@"CAMPAIGNSCRIPTID"];


NSArray *segmentElementArray = [order nodesForXPath:@"SEGINFO/SEGINFO_ROW" error:aError];//循环SEGINFO_ROW节点
if (segmentElementArray != nil) {

for (GDataXMLElement *segmentElement in segmentElementArray) {

OrderSegment *segment = [[OrderSegment alloc] init];

//获取SEGINFO_ROW节点下数据
segment.carrier = [segmentElement stringForTextNodeNamed:@"CARRIER"];
segment.flightType = [segmentElement stringForTextNodeNamed:@"FLIGHTNO"];
segment.depCode = [segmentElement stringForTextNodeNamed:@"DEPCODE"];
segment.arrCode = [segmentElement stringForTextNodeNamed:@"ARRCODE"];
segment.depPort = [segmentElement stringForTextNodeNamed:@"DEPPORT"];
segment.arrPort = [segmentElement stringForTextNodeNamed:@"ARRPORT"];
segment.flightNo = [segmentElement stringForTextNodeNamed:@"FLIGHTNO"];
segment.depTime = [segmentElement stringForTextNodeNamed:@"DEPTIME"];
segment.arrTime = [segmentElement stringForTextNodeNamed:@"ARRTIME"];

[orderObj.segments addObject:segment];
[segment release];

}

[orderArray addObject:orderObj];
}
[orderObj release];

}
return [orderArray autorelease];//返回数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【原创】转帖请注明来源,谢谢 -tag 1- 测试无内存泄露 1 创建数据对象() NSMutableDictionary *map = [[NSMutableDictionary alloc]init]; [map setObject:@"a" forKey:@"author"]; [map setObject:@"b" forKey:@"title"]; [map setObject:@"c" forKey:@"content"]; 或者 NSMutableArray *list = [[NSMutableArray alloc]init]; NSMutableDictionary *map1 = [[NSMutableDictionary alloc]init]; [map1 setObject:@"a1" forKey:@"author"]; [map1 setObject:@"b1" forKey:@"title"]; [map1 setObject:@"c1" forKey:@"content"]; [list addObject:map1]; NSMutableDictionary *map2 = [[NSMutableDictionary alloc]init]; [map2 setObject:@"a2" forKey:@"author"]; [map2 setObject:@"b2" forKey:@"title"]; [map2 setObject:@"c2" forKey:@"content"]; [list addObject:map2]; 2 调用封装,声明对象名称及XML模板,组装器会根据XML模板填充数据。 XmlPackage *xmlPackage = [[XmlPackage alloc]init]; NSData *data = [xmlPackage objctPackage:map objectName:@"book1" xmlTemplateName:@"template1"]; 或者 NSData *data = [xmlPackage listPackage:list objectName:@"book1" xmlTemplateName:@"template1"]; 3 返回DATA 4 利用解析解析并展现到UIView 部分代码如下: @implementation XmlPackage @synthesize obj; @synthesize isList; @synthesize xmlString; @synthesize objectName; @synthesize lvUp; @synthesize root; @synthesize buildEnd; -(NSData *)objctPackage:(NSMutableDictionary *)object objectName:(NSString *)name xmlTemplateName:(NSString *)templateName { NSMutableArray *array = [[NSMutableArray alloc]init]; [array addObject:object]; NSData *data = [self listPackage:array objectName:name xmlTemplateName:templateName]; [array release]; return data; } -(NSData *)listPackage:(NSMutableArray *)objects objectName:(NSString *)name xmlTemplateName:(NSString *)templateName { isList = YES; self.objectName = name; NSString *path = [[NSBundle mainBundle] pathForResource:templateName ofType:@"xml"]; NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path]; NSData *xmlData = [file readDataToEndOfFile]; NSXMLParser *xmlRead = [[NSXMLParser alloc] initWithData:xmlData]; [xmlRead setDelegate:self]; [xmlRead parse]; [xmlRead release]; //get dataTemplate for (int i=0;i<[objects count]; i++) { NSMutableDictionary *map = [objects objectAtIndex:i]; XmlNode *node = [[[XmlNode alloc]init]autorelease]; node.nodeName = objectName; [node addChildByMap:map]; [lvUp addChildNode:node]; } //get root's xmlString NSMutableString *x = [self.root getXmlString]; //NSLog(@"%@",x); if ((int)[x length]>0) { return [x dataUsingEncoding:NSUTF8StringEncoding]; } return nil; } - (void)dealloc { [obj release]; [xmlString release]; [objectName release]; [lvUp release]; //[root release]; [super dealloc]; } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if ([elementName isEqualToString:objectName]) { buildEnd = YES; }else{ if (!buildEnd) { //create node XmlNode *node = [[XmlNode alloc]init]; node.nodeName = elementName; //dataTemplate building... if (lvUp!=nil) { [lvUp addChildNode:node]; }else{ root = node; } lvUp = node; } } } @end ===== #import "XmlNode.h" @implementation XmlNode @synthesize nodeName; @synthesize nodeValue; @synthesize isLast; @synthesize list; @synthesize xmlString; - (void)dealloc { [nodeName release]; [nodeValue release]; [list release]; [xmlString release]; [super dealloc]; } -(NSString *)getXmlString { xmlString = [[NSMutableString alloc]init]; [xmlString appendString:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"]; [self getNodeStr:self string:xmlString]; return xmlString; } -(void)getNodeStr:(XmlNode *)node string:(NSMutableString *)str { if (node.isLast) { NSString *res = [[NSString alloc]initWithFormat:@"<%@>%@</%@>", node.nodeName, node.nodeValue, node.nodeName]; [str appendString:res]; [res release]; }else{ NSMutableString *a = [[[NSMutableString alloc]init]autorelease]; NSMutableArray *nodelist = [node getChilds]; for (int i=0;i<[nodelist count];i++) { XmlNode *node = [nodelist objectAtIndex:i]; [node getNodeStr:node string:a]; } NSString *res = [[NSString alloc]initWithFormat:@"<%@>%@</%@>", node.nodeName, a, node.nodeName]; [str appendString:res]; [res release]; } } -(void)addChildNode:(XmlNode *)node; { if (list==nil) { list = [[NSMutableArray alloc]init]; } [list addObject:node]; isLast = NO; } -(NSMutableArray *)getChilds { return list; } -(void)addChildByMap:(NSMutableDictionary *)map { NSEnumerator *keys = [map keyEnumerator]; id key; while (key = [keys nextObject]) { XmlNode *node = [[[XmlNode alloc]init]autorelease]; node.isLast = YES; node.nodeName = key; node.nodeValue = [map objectForKey:key]; [self addChildNode:node]; } } @end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值