XML&JSON
2015-06-09 11:28
501 查看
XML & JSON
XML
SAX解析
创建XML解析对象NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"bookstore" withExtension:@"xml"]; NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:fileURL];
设置XML解析对象的代理
开始解析
BOOL flag = [xmlParser parse]; if (!flag) { NSLog(@"xmlParser parse error."); }
NSXMLParser对象代理方法:
(void)parserDidStartDocument:(NSXMLParser *)parser
当开始解析XML文档的时候,调用这个方法。通常在这个方法里,
创建存储模型对象的数组
(void)parser:(NSXMLParser )parser didStartElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName attributes:(NSDictionary *)attributeDict
当开始解析,遇到元素的开始标签的时候,调用这个方法。通常在这个方法里,
创建模型对象或解析标签中的属性保存在模型对象中
(void)parser:(NSXMLParser )parser foundCharacters:(NSString )string
当解析到xml标签的文本内容的时候,调用这个方法, 通常在这里先
暂存解析到的文本内容
(void)parser:(NSXMLParser )parser didEndElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName
当解析xml内容遇到结束标签的时候,调用这个方法。通常在这个方法里,
需要将模型对象保存入数组中或把标签对应的文本内容解析出来,保存在模型对象中(KVC)
(void)parserDidEndDocument:(NSXMLParser *)parser
当整个xml文档全部解析结束的时候,该方法会被调用
(void)parser:(NSXMLParser )parser parseErrorOccurred:(NSError )parseError
当遇到解析错误时,该方法会被调用
DOM解析 (以GDataXMLNode为例)
使用:添加头文件搜索路径:
Build Settings->Header Search Paths->"/usr/include/libxml2"
用非ARC的方式编译GDataXMLNode.m文件:
-fno-objc-arc
链接libxml2.dylib该动态库:
Build Phases->Link Binary With Libraries->"libxml2.dylib"
/* * <节点> (GDataXMLNode) * 根据 DOM,XML 文档中的每个成分都是一个节点。 * DOM 是这样规定的: * 整个文档是一个文档节点 * 每个 XML 标签是一个元素节点 * 包含在 XML 元素中的文本是文本节点 * 每一个 XML 属性是一个属性节点 * 注释属于注释节点 */
根据XML文件创建NSData对象
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"bookstore" withExtension:@"xml"]; NSData *data = [NSData dataWithContentsOfURL:fileURL];
根据NSData对象创建GDataXMLDocument对象(即DOM模型对象),该对象在内存中是以树形结构存储的
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
通过DOM模型对象,取出XML文件的根元素
GDataXMLElement *rootElement = [doc rootElement];
由于是树形结构,所以,可以根据子元素的名字使用根元素获取到所有子元素,并类推获得子元素的子元素
for (GDataXMLElement *element in elements) { // 创建图书对象 YMBook *book = [[YMBook alloc] init]; // 根据属性名字,解析book元素的属性值 book.category = [[element attributeForName:kCategory] stringValue]; // 解析book的子元素包含的文本内容及其子元素的属性 GDataXMLElement *titleElement = [element elementsForName:kTitle][0]; book.title = [titleElement stringValue]; book.lang = [[titleElement attributeForName:kLanguage] stringValue]; GDataXMLElement *authorElement = [element elementsForName:kAuthor][0]; book.author = [authorElement stringValue]; GDataXMLElement *yearElement = [element elementsForName:kYear][0]; book.year = [yearElement stringValue]; GDataXMLElement *priceElement = [element elementsForName:kPrice][0]; book.price = [priceElement stringValue]; [_bookStore addObject:book]; }
JSON
从结构上看,所有的数据(data)最终都可以分解成三种类型:第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如”北京”这个单独的词
第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如”北京,上海”
第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如”首都:北京”
Douglas Crockford发明了JSON,Json的规定非常简单:
并列的数据之间用逗号(”, “)分隔
映射用冒号(”: “)表示
并列数据的集合(数组)用方括号(“[]”)表示
映射的集合(对象)用大括号(”{}”)表示
比如,下面这句话:
“北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。”
写成JSON格式就是这样:
[ {"城市":"北京","面积":16800,"人口":1600}, {"城市":"上海","面积":6400,"人口":1800} ]
如果事先知道数据的结构,上面的写法还可以进一步简化:
[ ["北京",16800,1600], ["上海",6400,1800] ]
rfc-4627
www.json.org/json-zh.htm
www.sojson.com
NSJSONSerialization
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error
JSONKit
使用:-fno-objc-arc
序列化:
NSArray
NSDictionary
NSString
– JSONData – JSONDataWithOptions:includeQuotes:error: - JSONDataWithOptions:serializeUnsupportedClassesUsingDelegate:selector:error: - JSONDataWithOptions:serializeUnsupportedClassesUsingBlock:error: – JSONString – JSONStringWithOptions:includeQuotes:error: - JSONStringWithOptions:serializeUnsupportedClassesUsingDelegate:selector:error: – JSONStringWithOptions:serializeUnsupportedClassesUsingBlock:error:
反序列化:
NSData
NSString
– objectFromJSONData – objectFromJSONDataWithParseOptions: – objectFromJSONDataWithParseOptions:error: – mutableObjectFromJSONData – mutableObjectFromJSONDataWithParseOptions: – mutableObjectFromJSONDataWithParseOptions:error: – objectFromJSONString – objectFromJSONStringWithParseOptions: – objectFromJSONStringWithParseOptions:error: – mutableObjectFromJSONString – mutableObjectFromJSONStringWithParseOptions: – mutableObjectFromJSONStringWithParseOptions:error:
相关文章推荐
- XML 与 JSON 优劣对比
- As3.0 xml + Loader应用代码
- DVI 视频接口图文解析
- IE6不能正常解析CSS文件问题的解决方法及原因分析
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- newtonsoft.json解析天气数据出错解决方法
- C#自写的一个HTML解析类(类似XElement语法)
- C#针对xml基本操作及保存配置文件应用实例
- ruby 过程对象 解析
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- C#中的Linq to Xml详解
- C#操作XML文件实例汇总
- vbs 解析json jsonp的方法
- SQL Server中的XML数据进行insert、update、delete
- SQL Server中的XML数据进行insert、update、delete操作实现代码