xml文件的解析方式
1.系统自带的解析方法
#import<UIKit/UIKit.h>
@interface ViewController : UIViewController
@property(strong,nonatomic) NSMutableArray *arrM;
@property(strong,nonatomic) NSMutableDictionary *dicM;
@property(strong,nonatomic) NSString *str;
@end
#import "ViewController.h"
@interface ViewController ()
@end@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//指定xml文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"xml"];
//转换成data类型对象
NSData *data = [NSData dataWithContentsOfFile:path];
//为parser指定初始化
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//指定代理
parser.delegate = self;
//实现文件xml解析 执行代理方法
BOOL bol = [parser parse];
//返回解析结果
NSLog(@"%d",bol);
}
/** *
文档解析开始 初始化全局的集合
* * @param parser
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser{
self.arrM = [NSMutableArray array];
}
/** * 文档解析结
* * @param parser
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"%@",self.arrM);
}
/** * 文档元素 解析 开始
* * @param parser 解析的对象
* @param elementName 元素的名称
* @param namespaceURI 命名空间
* @param qName
* @param attributeDict 属性的字典
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary*)attributeDict
{
//找到文档中User元素,开始初始化字典
if ([elementName isEqualToString:@"User"]) {
//初始化字典
self.dicM = [NSMutableDictionary dictionary];
//向字典中添加属性元素
[self.dicM setDictionary:attributeDict];
}
}
/**
* 文档解析结束
*
* @param parser
* @param elementName 元素名称
* @param namespaceURI
* @param qName
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
if ([elementName isEqualToString:@"id"] || [elementName isEqualToString:@"name"] || [elementName isEqualToString:@"age"]) {
[self.dicM setObject:self.str forKey:elementName];
}
else if ([elementName isEqualToString:@"User"]){
[self.arrM addObject:self.dicM];
}
}
/**
* 解析文件内容
*
* @param parser 元素对象
* @param string 显示文本内容
*/
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
self.str = string;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
2.GDataXMLNode解析
需要导入第三方封装的库GDataXMLNode才能对数据进行解析的操作
而且在操作前还要对文件进行配置
1.libxml includes require that the target Header Search Paths contain /usr/include/libxml2
2.and Other Linker Flags contain
-lxml2
3.必须导入libxml2.tdb或libxml2.2.tdb框架才能使用
还要把在非ARC状态下对添加第三方文件的.m文件的状态进行更改
1.在Build Phases目录下,选择Compile Source(4 items)下添加的库文件选中后双击
2.在弹出的提示框中输入“-fno-objc-arc”,关闭即可配置成功,如果对以上的添加没做完是不能进行正确的操作的,请读者谨慎配置
#import<UIKit/UIKit.h>
#import "GDataXMLNode.h"
@interface ViewController : UIViewController
@property(strong,nonatomic) NSMutableArray *myarrM;
@end
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初始化可变集合
self.myarrM = [NSMutableArray array];
//获取文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"xml"];
//初始化data对象
NSData *data = [NSData dataWithContentsOfFile:path];
//使用NSData对象初始化
GDataXMLDocument *docoment = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
//获取根节点(Users)
GDataXMLElement *rootelement = [docoment rootElement];
//获取根节点下的节点
NSArray *userarr = [rootelement elementsForName:@"User"];
//遍历根节点下的集合
for (GDataXMLElement *user in userarr) {
NSString *userID = [[user attributeForName:@"id"] stringValue];
NSLog(@"User id is %@",userID);
//获取name节点的值
GDataXMLElement *nameelemnet = [[user elementsForName:@"name"] objectAtIndex:0];
NSString *userName = [nameelemnet stringValue];
NSLog(@"User name is %@",userName);
//获取age节点的值
GDataXMLElement *userAge = [[user elementsForName:@"age"] objectAtIndex:0];
NSString *userage = [userAge stringValue];
NSLog(@"User age is %@",userage);
//初始化临时可变字典
NSMutableDictionary *dicM = [NSMutableDictionary dictionary];
//将得到的信息添加到字典中
[dicM setObject:userID forKey:@"id"];
[dicM setObject:userName forKey:@"name"];
[dicM setObject:userage forKey:@"age"];
//将字典添加到集合中
[self.myarrM addObject:dicM];
}
NSLog(@"%@",self.myarrM);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
3.XMLDictionary解析方法
里面已经封装了很多的方法,可以根据具体情况选择适合自己的xml文件的解析方法进行解析
前提必须要导入XMLDictionary第三方库
#import<UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
#import "ViewController.h"
#import "XMLDictionary.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//获取文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"person" ofType:@"xml"];
//将数据转换为data 类型对象
NSData *data = [NSData dataWithContentsOfFile:path];
//解析xml文件
NSDictionary *dic = [NSDictionary dictionaryWithXMLData:data];
NSLog(@"%@",dic);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end