JSON&XML 解析总结



JSON & XML解析

JSON(数据传输):

JSON具有对象(字典)和数组两种数据格式。字典用“{}”,数组用“[]”。其实也是key-value(字符串,数值,布尔类型,对象,空对象,数组)键值对。

JSON 可以与Object-C相互转换  ->则是JSON的解析过程(正向与逆向的解析-为了说明自己定义的正逆)->可用于数据的持久化,将JSON数据写入文件中保存(逆向);从文件中读出数据(正向)。

JSON ->Object-C(正向):jsondata->jsonarray/jsondictionary

Object-C -> JSON(逆向):jsonarray/jsondictionary ->jsonstring->jsondata

系统为JSON解析提供了NSJSONSerialization这个类,这个类里面提供了众多解析方法。

//    字典转换为JSON

NSDictionary *[email protected]{

@"name":@"jessi",

@"age":@19,

@"married":@(true),

@"friend":@[@"pwy",@"wm",@"zjay"

],

};

//NSData的对象是二进制数据  把dictionary转化为二进制数据进行传输转化 又通过字符串转换为字符串

NSData *jsonData;

if ([NSJSONSerialization  isValidJSONObject:dic])

{

jsonData=[NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil ];

}

NSString *str=[[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];

// 数组转换JSON

NSArray *[email protected][@123,@"pwy",@"sting",@1];

NSData *data;

if ([NSJSONSerialization isValidJSONObject:array])

{

data=[NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];

}

NSString *str1=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

//   JSON转字典和数组 可变性

//    正确的JSON字符串格式才能转成功

//    NSJSONReadingMutableContainers  转为可变的字典和数组

//    NSJSONReadingMutableLeaves /NSJSONReadingAllowFragments  转为不可变的字典和数组

[email protected]"{\"name\":\"jessi\",\"age\":12,\"height\":165}";

NSLog(@"str1%@",str1);

data=[str1 dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *dic1=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

XML(数据传输):

XML 只有字典一种数据格式 ,是一种树型存储结构,必须有根节点,逐级嵌套(用树的思想来思考)。XML不像JSON一样是键值对存储数据,不过也稍微有那样的意思,XML是用标签和值来存储数据。XML数据写入(保存)文件可以数据的持久性,便于网络传输。

XML的解析工具有多种,包括:libxml2->hpple, GDataXML,  KissXML,  NSXMLParser-> XMLDictionary,目前我们经常使用的则是XMLDictionary,hpple。

Xml解析方法1:

SAX(simple API for xml)逐行解析,快捷消耗内存少,不需要在内存中构建文档树->NSXMLParser-> XMLDictionary

解析前准备:

// xml的解析器 (加载解析器之后 再解析XML文件的内容)判断完之后才开始做解析

//    单例模型

XMLDictionaryParser *parser=[XMLDictionaryParser  sharedInstance];

//    保存节点名称,默认只保存根节点名称

parser.nodeNameMode=XMLDictionaryNodeNameModeAlways;

//保留注释

//    parser.preserveComments=YES;

//    用字典保存属性值

parser.attributesMode=XMLDictionaryAttributesModeDictionary;

NSDictionary *xmDic=[NSDictionary dictionaryWithXMLFile: @"/Users/apple/Desktop/test1.xml"];

NSDictionary *[email protected]{

@"__name":@"Student",

@"__attributes":@{@"id":@"abc",@"class":@"conquer"},

@"name":@"jessi",

@"age":@18,

@"gender":@"female",

@"friends":@{

@"friend":@[

@{@"__text":@"nobody",}

]

}

};

NSString *xmlstring=[dic XMLString];

[xmlstring writeToFile: @"/Users/apple/Desktop/test2.xml" atomically:YES encoding:NSUTF8StringEncoding error:nil];

NSString *xmlFilePath;

xmlFilePath = [[NSBundle mainBundle] pathForResource:@"test1" ofType:@"xml"];

NSLog(@"xmlfilepath->%@",xmlFilePath);

//   xmlparse 解析xml文件

xmlDocPtr doc = xmlParseFile([xmlFilePath UTF8String]);

//    xmlparse 解析xml文件   从内存里边读出来

NSString *xmlStr = [NSString stringWithContentsOfFile:xmlFilePath encoding:NSUTF8StringEncoding error:nil];

// nssstring -> cstring

xmlDocPtr doc1 = xmlParseMemory([xmlStr UTF8String], (int)[xmlStr lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

//    获取根节点

xmlNodePtr  root =  xmlDocGetRootElement(doc);

if (xmlStrcmp(root->name, (const xmlChar *)"student") == 0)

{

NSLog(@"rootname is student");

//    获取子节点

root = root->xmlChildrenNode;//父节点指向子节点

//    子节点不为空则可以继续子节点的查找

while (root != NULL)

{

if (!xmlStrcmp(root->name, (const xmlChar *)"Books"))

{

//            Books的子节点book

xmlNodePtr book = root->xmlChildrenNode;

while (book != NULL)

{

if (!xmlStrcmp(book->name, (const xmlChar *)"Book"))

{

NSLog(@"name:%s",book->name);

//                获取type的属性

NSLog(@"type:%s",xmlGetProp(book,(const xmlChar *)"type"));

xmlChar *content = xmlNodeListGetString(doc, book->children, 1);

NSLog(@"content:%@",[NSString stringWithCString:(const char *)content encoding:NSUTF8StringEncoding]);

}

//            获取同级的下一个节点兄弟节点

book = book->next;

}

}

root = root->next;

}

xmlFree(doc);

}

Xml解析方法2:

DOM(Document Object Model文档对象模型),解析时将整个文档读入内存当中,利用c库的libxml.dylib实现了解析,可以对文档进行修改和编辑->libxml2->hpple(常用于解析网络数据)

解析前准备:

解析糗事百科为例子:

NSData  *dataout = [NSData dataWithContentsOfFile:@"/Users/apple/Desktop/qiubai1.html" ];

TFHpple *doc = [[TFHpple alloc] initWithHTMLData:dataout encoding:@"utf-8"];

//    取出一页的20个故事

NSArray *result = [doc searchWithXPathQuery:@"//div[@class = ‘article block untagged mb15‘]"];

for (TFHppleElement *elem in result)

{

//        爬出头像

NSArray *headimg = [elem searchWithXPathQuery:@"//div[@class = ‘author‘]/a/img"];

TFHppleElement *headerimg = [headimg firstObject];

NSString *headStr = [headerimg attributes][@"src"];

NSLog(@"headerStr->%@",headStr);

//       爬出用户名

TFHppleElement *nickname = [[elem searchWithXPathQuery:@"//div[@class = ‘author‘]/a"] firstObject];

NSString *nicknameStr1 = [nickname content];

//        去空白-此法无用

//        NSString *nicknameStr2 = [nicknameStr1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

//        字符串分割 \n\n nickname \n

NSArray *nick = [nicknameStr1 componentsSeparatedByString:@"\n"];

NSString *nicknameStr = nick[2];

NSLog(@"nickname->%@",nicknameStr);

TFHppleElement *story = [[elem searchWithXPathQuery:@"//div[@class = ‘content‘]"] firstObject] ;

NSString *storycontent = [story content];

NSLog(@"storycontent->%@",storycontent);

TFHppleElement *fun = [[elem searchWithXPathQuery:@"//div[@class = ‘stats‘]/span"] firstObject];

NSString *funny = [fun content];

NSLog(@"funny->%@",funny);

TFHppleElement *conmment = [[elem searchWithXPathQuery:@"//div[@class = ‘stats‘]/span/a"] firstObject];

NSString *conmments1 = [conmment content];

NSArray *con = [ conmments1 componentsSeparatedByString:@"\n"];

NSString *conmments = con[1];

时间: 2025-01-04 04:32:51

JSON&XML 解析总结的相关文章

ios之json,xml解析

JSON解析步骤: 1.获取json文件路径 NSString*path = [[NSBundle mainBundle] pathForResource:@"Teacher"ofType:@"json"]; 2.读取文件中的data NSData *data = [NSData dataWithContentsOfFile:path]; 3.把data转化为可变数组或者可变字典 是字典还是数组要看json最外层数据是什么.NSJSONSerialization是重

IOS JSON/XML解析

<pre name="code" class="objc">/*---------------------------XML_SAX解析-------------------------------*/ //XML SAX解析 - (IBAction)XML_SAX:(id)sender { NSData *da = [[NSData alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathFor

Json和XML解析

NSXMLParse 关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象模型.解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写).苹果官方原生的NSXMLParse类库采用第一种方式,即SAX方式解析XML,它基于事件通知的模式,一边读取文档一边解析数据,不用等待文档全部

iOS中的数据解析(XML,JSON),SAX解析,DOM解析

第三方 SAT解析 #import "SAXTableViewController.h" #import "Student.h" @interface SAXTableViewController ()<NSXMLParserDelegate> @property (nonatomic, retain) NSMutableArray *dataSourse; // 存储学生对象 @property (nonatomic, retain) Student

UI_16 XML、JSON数据结构解析

从事先规定好的格式中提取数据,即为解析.iOS开发常见的解析有:XML解析.JSON解析 一.XML解析 XML:Extensible Markup language(可扩展标记语?),主流数 据格式之?,可以?来存储和传输数据. XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.TinyXML和GDataXML.如何选择? 以下几点摘自iOS平台XML解析类库对比和安装说明

JSON解析和XML解析

一. XML:用到一个开源解析类,GDataXMLNode(将其加入项目中),添加libxml2.dylib框架 经常用到的方法: 1.- (id)initWithXMLString:(NSString *)str options:(unsigned int)mask error:(NSError *)error 2.- (id)initWithData:(NSData *)data options:(unsigned int)mask error:(NSError *)error 这两个方法可

Cocos2d-x 3.0 Json用法 Cocos2d-x xml解析

Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于external/json下. rapidjson 项目地址:http://code.google.com/p/rapidjson/wiki:http://code.google.com/p/rapidjson/wiki/UserGuide 下面就通过实例代码讲解rapidjson的用法. 使用rapidjson解析json串 引入头文件 1 2 #include "json/rapidjson.h" #inc

JSON XML 数据解析

作为客户端,一般从后台传入的数据主要是两种 ,一种是JSON数据 一种是XML格式的数据  对于这两种数据  咱们都要一套自己的解析方法 JSON: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写. JSON 是出自于 JavaScript ,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象 常见的两种格式: 1

iOS - - JSON 和 XML解析

JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格式很像OC中的字典和数组 {"name" : "jack", "age" : 10} {"names" : ["jack", "rose", "jim"]} 标准JSON