XML可扩展标记语言
优点:代码的安全性很高,可以很容易的替换模板。
缺点:开发成本太高
组成部分
- 文档声明(在xml文档的最前面,必须写一个文档声明,用来声明xml文档的类型)最常用的文档的字符编码如下
<?xml version="1.0" encoding="UTF-8"?>
XML解析
DOM:一次将所有的XML文档加载进内存,比较适合解析小文件(对应goole)
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析较大的文件(对应苹果原生)
XML解析方式的选择建议:
用GdataxML解析
导入第三方文件到xcode,配置xcode
第一步:导入动态库,在 xcode首页 的 General 下面
第二步:
第三步:
第四步:取消GdataxML的arc编译环境,方法同JSONKit的配置
- GdataxMLDocument : 代表整个xml文档
- GdataxMLElement : 代表文档中的元素
- attributeForName : 元素对象方法,可以获得属性值
- elementsForName : 元素对象方法,获得这个元素的所有子元素
- rootElement : 元素对象方法,获取根元素
相比之下,JSON的体积小于XML,所以服务器返回给移动端的数据格式以JSON居多
代码举例
-(void)saxCcick{
NSString *xmlPath = [[NSBundle mainBundle]pathForResource:@"bookstore" ofType:@"xml"];
NSURL *url = [NSURL fileURLWithPath:xmlPath];
//创建解析器对象
NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:url];
//设置委托
parser.delegate = self;
if (![parser parse]) {
NSLog(@"解析失败");
}
}
#pragma mark - nsxmlParserDelegate
//解析开始 创建储存对象
-(void)parserDidStartDocument:(NSXMLParser *)parser{
_bookArray = [NSMutableArray array];
}
//解析 开始标签 调用,初始化模型,将元素的属性存储到模型
-(void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"book"]) {
//初始化模型
_mode = [BookMode new];
_mode.category = attributeDict[@"category"];
}else if ([elementName isEqualToString:@"title"]){
_mode.lang = attributeDict[@"lang"];
}else if ([elementName isEqualToString:@"auther"]){
_mode.author = attributeDict[@"auther"];
}else if ([elementName isEqualToString:@"year"]){
_mode.year = attributeDict[@"year"];
}else if ([elementName isEqualToString:@"price"]){
_mode.price = attributeDict[@"price"];
}
}
//找到元素内容,内容暂时存在中间变量,中间变量是动态刷新的
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//内容赋给中间变量
_tempStr = string;
}
//解析 结束标签 调用,给模型元素赋值
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"book"]) {
[_bookArray addObject:_mode];//解析到最后把模型加载到数组中
}else if (![elementName isEqualToString:@"bookstore"]){
NSLog(@"====key=%@=====value=%@",elementName,_tempStr);
//kvc
// if ([elementName isEqualToString:@"id"]) {
// [_mode setValue:_tempStr forKey:@""];
// }
[_mode setValue:_tempStr forKey:elementName];//?????????
}
}
//文档解析结束调用
-(void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"%ld",_bookArray.count);
}
//文档解析失败调用
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"失败");
}