XML解析的几种方法
第一种方法系统自带的解析方法(NSXMLParser)
//1、指定XML文件
NSString *path=[[NSBundle mainBundle] pathForResource:@"person" ofType:@"xml"];
//转换成data类型对象
NSData *data=[NSData dataWithContentsOfFile:path];
//2、为parser指定初始值
NSXMLParser *parser=[[NSXMLParser alloc] initWithData:data];
//指定代理
parser.delegate=self;
//3、实现文件解析
BOOL bol=[parser parse];
//返回解析的结果
NSLog(@"%d",bol);
}
//开始解析xml文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//初始化集合
self.arryM=[NSMutableArray array];
NSLog(@"开始解析文档StartDocument");
}
//xml文档解析结束,输出集合的内容
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"结束解析文档DidEndDocument");
NSLog(@"%@",self.arryM);
}
//文档元素解析开始,attributeDict表示属性的字典
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict
{
//找到文档中user的元素,初始化字典 dictM
if ([elementName isEqualToString:@"User"])
{
//文档开始 初始化字典
self.dictM=[NSMutableDictionary dictionary];
//向字典中添加属性元素
[self.dictM setDictionary:attributeDict];
}
NSLog(@"<%@>",elementName);
}
//结束解析文档元素
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
//判断元素的关键字,只有符合name或者age的时候才向字典中添加元素
if ([elementName isEqualToString:@"name"]||[elementName isEqualToString:@"age"])
{
//这时候dictM中已经有三对键值对啦
[self.dictM setObject:self.strM forKey:elementName];
}
//直到找到User元素标签时,才向arrM中添加字典
else if ([elementName isEqualToString:@"User"])
{
[self.arryM addObject:self.dictM];
}
NSLog(@"</%@>",elementName);
}
//解析文件元素的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//将局部的字符串赋值给全局变量的字符串
self.strM=string;
NSLog(@"%@",string);
}
第二种方法XMLDictionary解析
第三种GDataXML第三方类库的解析方法(也是解析美团接口的城市列表中的城市,纬度,经度)
使用NSdata对象初始化
GDataXMLDocument *doc=[[GDataXMLDocument alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.meituan.com/api/v1/divisions?mtt=1.help%2Fapi.0.0.im785tzf"]] options:0 error:nil];
//获取根节点
GDataXMLElement *rootelement=[doc rootElement];
//获取根节点下的节点
NSArray *User=[rootelement elementsForName:@"divisions"];
for (GDataXMLElement *user in User)
{
//获取User节点的id属性
NSString *userID=[[user attributeForName:@"id"] stringValue];
//NSLog(@"%@",userID);
//获取name节点的值
//GDataXMLElement *namelement=[[user elementsForName:@"name"]objectAtIndex:0];
NSString *name=[[[user elementsForName:@"name"]objectAtIndex:0] stringValue];
NSLog(@"%@",name);
//获取age节点的值
//GDataXMLElement *agelement=[[user elementsForName:@"age"]objectAtIndex:0];
NSString *age=[[[user elementsForName:@"location"]objectAtIndex:0] stringValue];
//NSLog(@"%@",age);
//将的到的name,age,id先放到一个字典,然后在拼接成一个集合
NSMutableDictionary *dic=[NSMutableDictionary dictionary];
[dic setObject:userID forKey:@"id"];
[dic setObject:name forKey:@"name"];
[dic setObject:age forKey:@"location"];
[self.arrM addObject:dic];
}
NSLog(@"%@",self.arrM);
}