XML
Extensible Markup Language(可扩展的标记语言),主流数据之一,可用来存储和传输数据。
XML的作用:
1.配置文件
2.内容管理
3.数据交换
XML的解析方式有两种:SAX解析 DOM解析 (安卓有一个PULL)。
SAX解析:
simple API for XML
基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)
工程创建:
1、Xcode下创建:
在Message.txt下写一个简单的标准格式样板,如下:
<?xml version="1.0" encoding="UTF-8"?>
<Persons>
<person>
<name>张三</name>
<sex>男</sex>
</person>
<person>
<name>李四</name>
<sex>女</sex>
</person>
<person>
<name>王五</name>
<sex>男</sex>
</person>
</Persons>
2、在控制文件 .h 文件中声明三个属性
@property (nonatomic, strong) NSMutableArray *data;
@property (nonatomic, copy) NSString *currentElement;
@property (nonatomic, strong) NSMutableString *tempString;
注:
声明一个可变字符串 tempString的原因:
使用XML解析,如果解析内容中出现以数字开头的信息,如:2016年1月,
它会先解析出“2016”,然后重新解析,得出“年1月”。所以要加一个可变字符串,在解析中进行字符串的拼接,否则“年1月”会将“2016”这个信息覆盖掉。
3、开始解析:
1)创建一个Person类的model,包含:name,sex。
2)在控制文件中引入协议
@interface RootViewController ()<NSXMLParserDelegate>
- (void)viewDidLoad {
[super viewDidLoad];
[self.rv.button1 addTarget:self action:@selector(saxXmlAction) forControlEvents:UIControlEventTouchUpInside];
- (void)saxXmlAction{
//模拟从网路上拿到数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];
//开始解析
//创建解析对象,绑定数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//指定代理
parser.delegate = self;
//开始解析
[parser parse];
}
//实现代理的方法
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"开始解析文档");
self.data = [NSMutableArray array];
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
NSLog(@"开始解析标签");
if ([elementName isEqualToString:@"person"]) {
Person *p = [[Person alloc] init];
[self.data addObject:p];
}
self.currentElement = elementName;
self.tempString = [NSMutableString string];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog( @"解析中间数据项");
[self.tempString appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
Person *p = [self.data lastObject];
//利用KVC进行属性赋值
[p setValue:self.tempString forKey:self.currentElement];
NSLog(@"结束解析标签");
self.currentElement = nil;
self.tempString = nil;
}
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"结束解析文档");
for (Person *p in self.data) {
NSLog(@"%@--%@", p.name, p.sex);
}
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"OMG,文档有毒");
}