OC学习--JSON解析和XML解析

本文深入探讨了XML解析的基本概念与第三方类库GData的使用方法,以及如何利用XPath进行数据提取。同时,文章详细介绍了JSON数据的结构与解析流程,包括本地与网络数据的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、XML解析、


什么是XML?

|~ 扩展标记语言 (Extensible Markup Language, XML)

|~ 是一种标记语言,很类似HTML

|~XML设计的宗旨是传输数据和存储数据,而非显示数据

|~XML标签没有被预定义,需要自定义标签

|~具有自我描述性

|~格式统一,跨平台和语言


    


====================XML解析========================

1、使用系统类NSXMLParser比较繁琐,现在基本上已经不再使用

2、通常使用第三方类库GData库

第三方类库使用的步骤:

(1)导入GData库

底层使用系统的libxml2库, 使用的时候添加libxml2


(2)添加libxml二进制库

Build Phases ---> Link Binary

添加 libxml2.dylib


(3)设置头文件搜索路径  

Build Setting--->header  search Path 

添加   /usr/include/libxml2


(4)如果是arc的工程

Build Phases ---> Compile Source File

GDataXmlNode.m(非arc的)

填写编译选项:-fno-objc-arc

GData 第三方库 有两种方式解析

     1、获取根节点所有元素,遍历所有的子节点

eg.①、解析本地XML文件



  //1读取文件内容

        NSData *data=[NSData dataWithContentsOfFile:PATH];

        //2.根据二进制数据创建文档树

        

        GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:data options:0 error:nil];

        //3、获取根节点

        GDataXMLElement *root= [doc rootElement];

        //4.获取根节点所有直接子节点

        NSArray *ary= [root children];//只有一个元素

        GDataXMLElement *books=ary[0];

        //5.获取所有books的子节点(也就是book的一些信息)

        NSArray *bookAry= [books children];

        //定义一个数组用来存放解析出来的对象

        NSMutableArray *mArry=[[NSMutableArray alloc]init];

        //6.遍历数组,解析出每一本书

        for(GDataXMLElement *ele in bookAry)

        {

            Book *bk=[[Book alloc]init];

            NSArray *attrArr =[ele attributes];

            NSArray *gBook=[ele children];

            bk.id=[attrArr[0] stringValue];

            bk.language=[attrArr[1] stringValue];

            bk.name=[gBook[0] stringValue];

            bk.author=[[gBook[1] elementsForName:@"name"][0] stringValue] ;

            //bk.author=[gBook[1] stringValue];

            bk.price=[gBook[2] stringValue];

            bk.summary=[gBook[3] stringValue];

            [mArry addObject:bk];

        }




②、解析网络数据

//1.将网络地址字符串转化成NSURL对象

    NSURL *url=[NSURL URLWithString:Path];

    //2.将访问地址获取二进制数据

    NSData *data=[[NSData alloc]initWithContentsOfURL:url];

 //3.以二进制数据创建文档树

    GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:data options:0 error:nil];

其他同上(是一样的)



     2、使用xpath语法


==================XPATH介绍============================

|~ XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言

|~ XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

|~ XPath 使用路径表达式来选取 XML文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件 系统中看到的表达式非常相似。路径表达式是

从一个XML节点到另一个节点、或一组节点的书面步骤顺序。


===语法================================

3C1635A8-3BFD-4898-A414-8444F714CF94.png

F30B27DB-917A-4904-B93D-1261E7CF9A21.png

eg、①、解析本地数据


//1读取文件内容

        NSData *data=[NSData dataWithContentsOfFile:file];

        //2.根据二进制数据创建文档树

        GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:data options:0 error:nil];

 //3.获取文档树中的所有cd

  NSArray *cdArry=[doc nodesForXPath:@"//CD" error:nil];

    //4.遍历数组保存所有信息

    NSMutableArray *mArry=[[NSMutableArray alloc]init];

    for (GDataXMLElement *ele in cdArry) {

        YBCd *cd=[[YBCd alloc]init];

       NSArray *Ary= [ele children];

        cd.title= [Ary[0] stringValue];

        cd.artist=[Ary[1] stringValue];

        cd.country=[Ary[2] stringValue];

        cd.company=[Ary[3] stringValue];

        cd.price=[[Ary[4] stringValue] floatValue];

        cd.years=[[Ary[5] stringValue] intValue];

        [mArry addObject:cd];

        

    }



②、解析网络数据

//1、将路径转化成NSURL对象

    NSURL *url=[NSURL URLWithString:file];

    //2.从网络请求数据

    NSData *data=[NSData dataWithContentsOfURL:url];

    //3\创建文档树

    GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:data options:0 error:nil];

    //4.获取文档树中的所有cd

  NSArray *cdArry=[doc nodesForXPath:@"//CD" error:nil];

    //5.遍历数组保存所有信息

    NSMutableArray *mArry=[[NSMutableArray alloc]init];

    for (GDataXMLElement *ele in cdArry) {

        YBCd *cd=[[YBCd alloc]init];

       NSArray *Ary= [ele children];

        cd.title= [Ary[0] stringValue];

        cd.artist=[Ary[1] stringValue];

        cd.country=[Ary[2] stringValue];

        cd.company=[Ary[3] stringValue];

        cd.price=[[Ary[4] stringValue] floatValue];

        cd.years=[[Ary[5] stringValue] intValue];

        [mArry addObject:cd];

        

    }



二、JSON数据解析


===============什么是JSON?====

是JaveScript Object Notation的缩写,是一种轻量级的数据交换格式,支持多种语言,包括C, C#, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析和生成。独立于平台,独立于语言。


======================语法========================

J SON文件中的数据是以名称/值对的形式存储的,多个数据用逗号隔开;

花括号保存对象,中括号保存数组。


{

  "root": {

    "books": {

      "book": [

        {

          "-id": "1",

          "-language": "ch",

          "name": "乔布斯传",

          "author": { "name": "沃尔特·艾萨克森" },

          "price": "80.00",

          "summary": "一本介绍乔布斯传奇一生的图书。"

        },

        {

          "-id": "2",

          "-language": "ch",

          "name": "呐喊",

          "author": { "name": "鲁迅" },

          "price": "12.00",

          "summary": "揭示了中国的社会面貌,控诉了封建制度的罪恶,喊出了“五四”时期革命者的心声。它反映了“五四”彻底不妥协地反封建主义的革命精神,适应了中国革命从旧民主主义向新民主主义转变的需要,在中国现代文化史和文学史上占有重要地位!"

        },

        {

          "-id": "3",

          "-language": "en",

          "name": "哈利波特",

          "author": { "name": "JK罗琳" },

          "price": "365.00",

          "summary": "主人公哈利·波特在霍格沃茨魔法学校六年的学习生活和冒险故事。"

        }

      ]

    }

  }

}


================JSON数据解析===================================

1、本地文件解析

//解析本地

//1.从文件中读取数据

NSData *dataBooke=[NSData dataWithContentsOfFile:PATH];

///2.将二进制数据转换为OC对象

        id obj=[NSJSONSerialization JSONObjectWithData:data2 options:NSJSONReadingMutableContainers error:nil];

        id root=[obj objectForKey:@"root"];

        id books=[root objectForKey:@"books"];

        id bookArry=[books objectForKey:@"book"];

        //3.遍历解析每一本书

           NSMutableArray *marr=[[NSMutableArray alloc]init];

        for (id obj in bookArry) {

            Book *bk=[[Book alloc]initWithId:[obj objectForKey:@"-id"] language:[obj objectForKey:@"-language"] name:[obj objectForKey:@"name"] author:[[obj objectForKey:@"author" ] objectForKey:@"name"] price:[obj objectForKey:@"price"] summary:[obj objectForKey:@"summary"]];

            [marr addObject:bk];

            

        }




2、网络文件解析

  //解析网络数据

  //1.通过字符串初始化网址

   NSURL *url=[NSURL URLWithString:PATH2];

   //2.通过网络内容获取数据

  NSData *data2=[NSData dataWithContentsOfURL:url];

3、将二进制数据转化为OC对象

 //4.遍历解析每一本书











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值