iphone objective-c解析xml字符串(接收格式参照上篇 webservie xml字符串传值)

 

 

解析的方式有两种,这里只说一种

首先去把BlogTutorial给下载下来

然后把里面的TouchXML文件夹给导入工程

然后配置libxml,这个的配置以下地址有

http://blog.prosight.me/index.php/2010/02/586

 

然后就可以开始动作了,呵呵

这个东西要导入

#import "CXMLDocument.h"

 

 

变量格式定义:

 

NSMutableArray *tasksArray;

NSMutableArray *taskIdArray;

NSMutableArray *taskNameArray;

NSXMLParser *xmlParser;

NSMutableString *tempString;

NSMutableData *taskData;

NSMutableArray *bookArray;

NSMutableString *xmlTry;

BOOL recordResults;

 

@property (nonatomic,retain) IBOutlet NSXMLParser *xmlParser;

@property (nonatomic,retain) IBOutlet NSMutableArray *tasksArray;

@property (nonatomic,retain) IBOutlet NSMutableArray *taskIdArray;

@property (nonatomic,retain) IBOutlet NSMutableArray *taskNameArray;

@property (nonatomic,retain) IBOutlet NSMutableString *tempString;

@property (nonatomic,retain) IBOutlet NSMutableData *taskData;

@property (nonatomic,retain) IBOutlet NSMutableArray *bookArray;

@property (nonatomic,retain) IBOutlet NSMutableString *xmlTry;

 

有些冗余的东西,这里就不细化了。

 

 

 

这段代码贴在程序入口处

 

taskData = [[NSMutableData alloc] init];

    NSString *soapMessage = [NSString stringWithFormat:

@"<?xml version=/"1.0/" encoding=/"utf-8/"?>/n"

"<soap:Envelope xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" xmlns:soap=/"http://schemas.xmlsoap.org/soap/envelope//">/n"

"<soap:Body>"

"<getUserList xmlns=/"http://view//">"

"<userID>%@</userID>"

"</getUserList >"

"</soap:Body>"

"</soap:Envelope>",textField1.text];

    //建立连接

    NSURL *url = [NSURL URLWithString:@"http://192.168.0.1:8080/test/services/UserList"];

    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];

    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

    //post方式提交数据

    [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    [theRequest addValue: @"" forHTTPHeaderField:@"SOAPAction"]; //这个地方的Action名参照webservice提供的文件说明

    [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];

    [theRequest setHTTPMethod:@"POST"];

    [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

    //NSURLConnection于服务器交互

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    [theConnection release];

 

 

 

//收到服务器回答

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    [taskData setLength: 0];

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    [taskData appendData:data];

}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    NSLog(@"ERROR with theConenction");

    [connection release];

    [taskData release];

}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    NSLog(@"DONE. Received Bytes: %d", [taskData length]);

    NSString *theXML = [[NSString alloc] initWithBytes: [taskData mutableBytes] length:[taskData length] encoding:NSUTF8StringEncoding];

    //NSLog(theXML);

    [theXML release];

 

    if( xmlParser )

    {

        [xmlParser release];

    }

 

    xmlParser = [[NSXMLParser alloc] initWithData: taskData];

    [xmlParser setDelegate: self];

    [xmlParser setShouldResolveExternalEntities: YES];

    [xmlParser parse];

 

    [connection release];

    [taskData release];

}

 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName

   attributes: (NSDictionary *)attributeDict

{

    if( [elementName isEqualToString:@"getUserListResponse"])

    {

        if(!tempString)

        {

            tempString = [[NSMutableString alloc] init];

        }

        recordResults = TRUE;

    }

}

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

{

    if( recordResults )

    {

        [tempString appendString: string];

    }

}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    if( [elementName isEqualToString:@"getUserListResponse"])

    {

        recordResults = FALSE;

NSLog(@"soapResults: %@", tempString);

NSMutableArray *res = [[NSMutableArray alloc] init];

CXMLDocument *doc = [[CXMLDocument alloc] initWithXMLString: tempString options: 0 error: nil];

//创建一个数组,以存放我们从xml中得到的节点

NSArray *nodes = NULL;

//寻找节点为taskItem的所有节点 

nodes = [doc nodesForXPath:@"//taskItem" error:nil];

for (CXMLElement *node in nodes) {

NSMutableDictionary *item = [[NSMutableDictionary alloc] init];

int counter;

for(counter = 0; counter < [node childCount]; counter++) {

// 从节点中取出值,按照键值对存储在NSMutableDictionary

[item setObject:[[node childAtIndex:counter] stringValue] forKey:[[node childAtIndex:counter] name]];

}

// 取得节点属性值,并存储在NSMutableDictionary

[item setObject:[[node attributeForName:@"taskId"] stringValue] forKey:@"taskId"];  // <------ this magical arrow is pointing to the area of interest

[res addObject:item];

[item release];

}

NSLog(@"%@", res);

[res release];

        [tempString release];

        tempString = nil;

    }

}

 

 

【原创】转帖请注明来源,谢谢 -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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值