标签:
“自描述的”结构化文档
1 XML文档结构
声明:定义了XML文件的版本和使用的字符集 <>
根元素:开始标签 结束标签
子元素:开始标签 结束标签
属性: 定义在开始标签中 属性名 属性值(放置在双引号或单引号之间) 一个元素不能有多个名字相同的属性。
命名空间:为XML文档提供名字唯一的元素和属性
************
XML 命名空间提供避免元素命名冲突的方法。
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。
**************
限定名:定义了元素和属性的合法标示符,用作特定元素或属性的引用
2 解析XML文档之使用NSXML
默认的解析框架,采用基于事件驱动SAX模式解析,遇到标签和属性时会触发相应事件,只能读取不能修改。
核心是NSXMLParser和NSXMLParserDelegate
方法:parserDidStartDocument:文档开始的时候触发
parser:didStartElement:namespaceURI:qualifiedName:attributes:遇到开始标签时触发
parser:foundCharacters:遇到字符串时触发 触发字符包括换行符和回车符
parser:didEndElement:namespaceURI:qulifiedName:遇到结束标签时触发
parserDisEndDocument:文档结束时触发 解析完成 清理变量 返回数据给表示层
解析器类代码:
NSXMLParser是解析类 构造器-initWithContentOfURL:-initWithData:-initWithStream:
-(void)start
{
NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"];
NSURL *url = [NSURL fileURLWithPath:path];另一个是urlWithString:
//开始解析XML
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
parser.delegate = self;
[parser parse];
NSLog(@"解析完成...");
}
//文档开始的时候触发
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
_notes = [NSMutableArray new];初始化,为了装载解析好的数据
}
//文档出错的时候触发
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"%@",parseError);
}
//遇到一个开始标签时候触发
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict属性字典
{
_currentTagName = elementName;标记当前解析器的位置
if ([_currentTagName isEqualToString:@"Note"]) {
NSString *_id = [attributeDict objectForKey:@"id"];值是1.2.3.4
NSMutableDictionary *dict = [NSMutableDictionary new];
[dict setObject:_id forKey:@"id"];
[_notes addObject:dict];
}
}
//遇到字符串时候触发
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//替换回车符和空格
string =[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([string isEqualToString:@""]) {
return;
}
NSMutableDictionary *dict = [_notes lastObject];按照XML上下顺序解析的,所以这里正确
if ([_currentTagName isEqualToString:@"CDate"] && dict) {
[dict setObject:string forKey:@"CDate"];
}
if ([_currentTagName isEqualToString:@"Content"] && dict) {
[dict setObject:string forKey:@"Content"];
}
if ([_currentTagName isEqualToString:@"UserID"] && dict) {
[dict setObject:string forKey:@"UserID"];
}
}
//遇到结束标签时候出发
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName;
{
self.currentTagName = nil;
}
//遇到文档结束时候触发 解析完成,将数据返回表示层,清理变量
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
self.notes = nil;
}
3 解析XML文档之使用TBXML
采用DOM模式,第三方框架
准备:下载TBXML并压解,添加TBXML所依赖的框架和库Foundation.framework UIKit.framework CoreGraphics.framework libz.dylib
添加工程预编译头文件MyNotes-Prefix.pch 代码为
#ifndef MyNotes_PrefixHeader_pch
#define MyNotes_PrefixHeader_pch
#import <Foundation/Foundation.h>
#define ARC_ENABLED
#endif
将文件配置到工程中:TARGETS-Build Settings-Apple LLVM 6.0 Language-Prefix Header 输入刚才创建的文件名
解析开始:TBXML类对象构造器 -initWithString:error:-initWithXMLData:error:适合网络通信解析 -initWithXMLFile:error:
//开始解析
-(void)start
{
_notes = [NSMutableArray new];
构造器
TBXML* tbxml = [[TBXML alloc] initWithXMLFile:@"Notes.xml" error:nil];
获得文档的根元素对象
TBXMLElement * root = tbxml.rootXMLElement;
// if root element is valid
if (root) {
TBXMLElement * noteElement = [TBXML childElementNamed:@"Note" parentElement:root];
while ( noteElement != nil) {
NSMutableDictionary *dict = [NSMutableDictionary new];
TBXMLElement *CDateElement = [TBXML childElementNamed:@"CDate" parentElement:noteElement];
if ( CDateElement != nil) {
NSString *CDate = [TBXML textForElement:CDateElement];
[dict setValue:CDate forKey:@"CDate"];
}
TBXMLElement *ContentElement = [TBXML childElementNamed:@"Content" parentElement:noteElement];
if ( ContentElement != nil) {
NSString *Content = [TBXML textForElement:ContentElement];
[dict setValue:Content forKey:@"Content"];
}
TBXMLElement *UserIDElement = [TBXML childElementNamed:@"UserID" parentElement:noteElement];
if ( UserIDElement != nil) {
NSString *UserID = [TBXML textForElement:UserIDElement];
[dict setValue:UserID forKey:@"UserID"];
}
//获得ID属性
NSString *_id = [TBXML valueOfAttributeNamed:@"id" forElement:noteElement error:nil];
[dict setValue:_id forKey:@"id"];
[_notes addObject:dict];
noteElement = [TBXML nextSiblingNamed:@"Note" searchFromElement:noteElement];
}
}
NSLog(@"解析完成...");
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
self.notes = nil;
}
4 JSON文档结构
对象:“名称-值”对集合,类似于字典类型,{。。:。。,。。:。。,。。:。。},名称要用双引号括起来
数组:值的有序集合,[,,,,],值可以是双引号扩起来的任意对象 字符串,结构可以嵌套
5 JSON数据解析 NSJSONSerialization
- (void)viewDidLoad
{
[super viewDidLoad];
NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"json"];
NSData *jsonData = [[NSData alloc] initWithContentsOfFile:path];
NSError *error;
options指定了解析JSON的模式 枚举NSJSONReadingOptions:MutableContainers指定解析返回的是可变的数组或字典 MutableLeaves指定叶节点是可变字符串 AllowFragments指定顶级节点可以不是数组或字典
id jsonObj = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers error:&error];
if (!jsonObj || error) {
NSLog(@"JSON解码失败");
}
self.objects = [jsonObj objectForKey:@"Record"];
}
iOS 开发指南 第15章 访问Web Service之数据交换格式
标签:
原文地址:http://www.cnblogs.com/haugezi/p/4821811.html