iOS开发笔记23-解析XML JSON
XML示例
<students>
<student>
<name>kellen</name>
<pass>111111</pass>
</student>
<student>
<name>wch</name>
<pass>222222</pass>
</student>
</students>
有开始就要有结束
首先新建项目
先在网上得到数据
用同步方法得到数据
- (void)viewDidLoad {
[super viewDidLoad];
/**
*先在网上得到数据
**/
NSString *strUrl = @"http://localhost/stuxml.xml";
NSURL *url = [NSURL URLWithString:strUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!error) {
NSLog(@"读到数据了,data = %@",data);
/**
*解析得到的数据
**/
}else{
NSLog(@"%@",error.localizedDescription);
}
}
/**
*解析得到的数据(XML)
**/
//1,创建xml的解析对象
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//2,代理执行当前类之中的方法
parser.delegate = self;
//3,解析开始
[parser parse];
解析结果
首先是这两个代理方法
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"开始解析");
}
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"结束解析");
}
然后解析节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
NSLog(@"解析一个节点开始");
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
NSLog(@"解析一个节点结束");
}
最后读到值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"读到的值 ,放在str里面 str = %@",string);
}
二,几个代理方法的调用具体分析
首先是开始解析
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"开始解析");
/**
*解析开始,需要对最外层的所有学生分配内存空间
**/
self.allStu = [[NSMutableArray alloc]init];
}
然后读节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
NSLog(@"解析一个节点开始,elementname = %@",elementName);
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
NSLog(@"解析一个节点结束,elementname = %@",elementName);
}
在读节点的时候碰到value就读出来
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"读到的值 ,放在str里面 str = %@",string);
}
最后结束解析
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"结束解析");
/**
*得到所有的学生
**/
for (int i =0; i<self.allStu.count; i++) {
NSLog(@"stu = %@",self.allStu[i]);
}
}
输出结果
三,赋值
创建一个类
#import <Foundation/Foundation.h>
@interface Stu : NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,copy)NSString *pass;
@end