Json和Xml

来源:互联网 发布:java编程什么系统好 编辑:程序博客网 时间:2024/06/09 23:48

*****************

数据描述信息的语言:①Json②Xml

*****************

①Json   

数组、字典互相嵌套  [{key: value, …}, …]

www.bejson.com上直接解析json文件 可以很直观的看

@interface NSJSONSerialization :NSObject 

解析json的工具类

+ (id)JSONObjectWithData:(NSData*)data options:(NSJSONReadingOptions)opterror:(NSError **)error;

json解析  返回值一般是字典或者数组


typedef NS_OPTIONS(NSUInteger,NSJSONReadingOptions) {

   NSJSONReadingMutableContainers = (1UL << 0),

    NSJSONReadingMutableLeaves= (1UL << 1),

   NSJSONReadingAllowFragments = (1UL << 2)

};

返回的内容是可变的还是不可变的(一般就是0 不可变)


*****

从沙盒文件解析json  本地读json

NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:[[NSFileHandlefileHandleForReadingAtPath:[[NSBundlemainBundle]pathForResource:@"scene_new"ofType:@"json"]]readDataToEndOfFile]options:NSJSONReadingMutableContainerserror:nil];


向沙盒文件写json  本地写json

NSOutputStream *os = [NSOutputStreamoutputStreamToFileAtPath:fileappend:NO];

    [osopen];

   [NSJSONSerialization writeJSONObject:dictoStream:osoptions:NSJSONWritingPrettyPrintederror:nil];

[os close];

输出流在使用之前一定要打开  用完之后要关闭

 


*********************


 

②Xml

html显示信息  xml描述和传递信息  他俩都是一个爹

 

出来的比json早

xml声明

最开头  可以省略

节点:key-value  value value

节点 属性 子节点 值

元素  标题 内容


每个xml只有一个根节点

节点可以同名


注释:

  不能出现在属性与标签中


CDATA 

[CDATA …]纯文本  不解析


   



属性 键值对  出现在开始标记中  值必须加引号  属性不能同名



OC提供了一个解析XML 的类  但是不好用  谷歌提供了一个第三方库 GData  但也是基于系统库的

然后导入系统库libxml2

然后设置building settings 的header search paths 的值为GData头文件中注释的目录/usr/include/libxml2


获取xml 中的内容(就是从沙盒文件中读字符串的过程)

NSString *path = [[NSBundlemainBundle]pathForResource:@"xml"ofType:@"txt"];

    NSString*xmlStr = [NSStringstringWithContentsOfFile:pathencoding:NSUTF8StringEncodingerror:nil];



xml文档类

@interface GDataXMLDocument :NSObject

- (id)initWithXMLString:(NSString*)str options:(unsigned int)maskerror:(NSError **)error;

文档类对象初始化

- (GDataXMLElement *)rootElement;

获取根节点


节点类

@interface GDataXMLElement :GDataXMLNode

取节点的三个方法(还有一个方法  不太一样 见下)

- (GDataXMLNode*)childAtIndex:(unsigned)index 根据索引获取子节点   需要强转

- (NSArray *)children 

所有子节点

- (NSArray *)elementsForName:(NSString*)name 

根据节点名 获取节点



获取节点属性的方法

- (NSArray *)attributes;

所有属性

- (GDataXMLNode*)attributeForName:(NSString *)name;

根据属性名字 获取属性值




- (NSString *)XMLString;

节点的原型  属性的原型

- (NSString *)name;

节点的名字    属性的名字

- (NSString *)stringValue;

节点的值  属相的值



**********************

获取节点的第四种方法:

XPATH 语法   路径语法

- (NSArray *)nodesForXPath:(NSString*)xpath error:(NSError **)error;

GDataXMLDocument的方法  通过XPATH路径获取节点

NSArray *array = [docnodesForXPath:@"/root/books/book/name"error:nil];

多路径

@"/root/books/book/name | /root/books/book/auther/name"

相对路径  所有叫name的节点

@"//name"

相对路径下的绝对路径   所有的book目录下的name节点

@"//book/name" 

第一个book目录下的的name

@"//book[1]/name"

最后一个book目录下的name

@"//book[last()]/name"

倒数第二个book目录下的name

@"//book[last() - 1]/name"

前两个book目录下的name

@"//book[position() <3]/name" 

第1个到第3个目录下的name(1和3是开)

@"//book[position() < 3][position() <1]/name"

book的属性中有num的节点

@"//book[@num]/name"

book的属性中有id属性 且id值为3的节点  以下两个都一样

@"//book[@id=3]/name"

@"//book[@id="3"]/name"


**************************

命名空间

一般都是网址

xmlns = uri

xmlns:sp = uri

声明命名空间一般是在根节点的属性里写

名称空间:名 


解析的时候要注意缺省的命名空间

- (NSArray*)nodesForXPath:(NSString *)xpath

             namespaces:(NSDictionary *)namespaces

                 error:(NSError**)error 


写xpath的时候要带着命名空间

[docnodesForXPath:@"/xmlns:root/xmlns:books/xmlns:book/book:name"namespaces:{@"xmlns":@"http://www.sina.com.cn",@"book":@"http://www.baidu.com"} error:nil];


 





0 0