json、xml解析

XML转HTML工具详解及示例代码 XML(可扩展标记语言)和HTML(超文本标记语言)是两种常用的标记语言,用于描述和展示文档内容。上述示例代码演示了如何使用DOMParser对象将XML字符串解析为DOM文档,并使用XSLTProcessor对象将XML文档转换为HTML。通过使用在线XML转HTML工具,您可以轻松地将XML文档转换为HTML格式。请确保您的XML文档合法,并选择合适的工具以获得最佳的转换结果。一旦转换完成,您可以在工具的界面中预览生成的HTML结果。完成导入后,工具会自动解析您的XML文档,并将其转换为HTML格式。 阅读详情

除了XML和Json,文中还涉及到的一些知识:第三方类库的使用,获取本地文件内容,网站API使用,GCD多线程编程,不做详细介绍,在代码出现的地方会注明。

先安利一波:

Json
XML

大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式。一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特定的数据结构,必须对其进行解析,得到我们可以处理的数据。所谓“解析”,就是从事先规定好的格式串中提取数据。解析的前提是数据的提供方与获取方提前约定好格式,数据提供方按照格式提供数据,数据获取方按照格式获取数据。

iOS开发中,几乎只要是与网络相关的应用,都离不开对网络数据的解析与应用。现总结几种常用方式来解析网络数据:

  • Json格式:
    • NSJSONSerialization,官方提供的Json数据格式解析类,iOS5以后支持
    • JSONKit(第三方类库)
    • SBJson
    • TouchJson
  • XML格式:
    • NSXMLParse,官方自带
    • GDataXML,Google提供的开元XML解析库

按照目前的发展,Json正在逐步取代XML成为网络数据的通用格式,所以我们重点来看Json格式的数据解析先。


准备工作

在看如何使用Json和XML之前,我们还有些事情要做,一是准备我们要解析的数据,二是搭建一个界面来看实际效果,毕竟我们解析了数据就是要在应用中展示出来的。

Json数据准备

关于如何获取网络的数据在这里就不多赘述了,你只需要获得一个从网站为开发者提供的API接口中获得我们想要的url就好了。我这里调用了豆瓣电影的API,随便选了在豆瓣电影首页的电影——《前任2:备胎反击战》,来看看豆瓣对这部电影的描述,由于标签太多,我这里只打算从中获取电影名称,体裁和剧情简介三部分打印出来。

我们可以先提前在浏览器中打开看一下这个待会我们将要得到的东西:

是不是很乱。。。没错,网站返回的东西虽然看上去好像有点规律,但是还是难以辨别,这里不用担心,我们可以使用一个叫做Json校验格式化工具的东西来优化一下它的显示,这里有一个在线的。我们把网站返回给我们的数据copy到这里,点击校验,如果没有什么问题的话,为了方便展示,我把它copy到了Sublime中,我们看一下结果你会发现它变成了下面这个样子,这样看起来就舒服多了,我们也可以非常清楚地看到每一对“Key——Velue”对,以及每个Velue的类型,弄清楚了,待会儿方便我们查询和显示。

找到了目标,下一步我们先做个界面的模子出来,展示我们解析过的数据。大概就是下面这个样子,点击不同的按钮,可以以不同的方式解析获得的数据并在TextView中打印。

界面搭好之后不要忘了关联到代码。

XML数据准备

我们在项目中新建一个xml文件,编写其中的内容,待会儿解析内容并打印到TextView。

XML内容为Person,有几个学生的信息,包括学号,姓名,性别和年龄,一会儿根据这些创建模型。


NSJSONSerialization

接下来就正式开始。苹果官方给出的解析方式是性能最优越的,虽然用起来稍显复杂。

首先我们在上面已经有了我希望得到的信息的网站的API给我们的URL,在OC中,我要加载一个NSURL对象,来向网站提交一个Request。到这里需要特别注意了,iOS9的时代已经来临,我们先前在旧版本中使用的某些类或者方法都已经被苹果官方弃用了。刚刚我们向网站提交了一个Request,在以往,我们是通过NSURLConnection中的sendSynchronousRequest方法来接受网站返回的Response的,但是在iOS9中,它已经不再使用了。从官方文档中,我们追根溯源,找到了它的替代品——NSURLSession类。这个类是iOS7中新的网络接口,苹果力推之,并且现在用它完全替代了NSURLConnection。关于它的具体用法,还是蛮简单的,直接上代码(ViewController.m文件):

#import "ViewController.h"

@interface ViewController ()
@property (retain, nonatomic) IBOutlet UITextView *textView;
@property (nonatomic, strong) NSMutableDictionary *dic;
@property (nonatomic,strong) NSString *text;
@end

@implementation ViewController

  • (IBAction)NSJson?UIButton *)sender {
    //GCD异步实现
    dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(q1, ^{

      <span class="hljs-comment">//加载一个NSURL对象</span>
      <span class="hljs-built_in">NSURLRequest</span> *request = [<span class="hljs-built_in">NSURLRequest</span> requestWithURL:[<span class="hljs-built_in">NSURL</span> URLWithString:<span class="hljs-string">@"https://api.douban.com/v2/movie/subject/25881786"</span>]];
    
      <span class="hljs-comment">//使用NSURLSession获取网络返回的Json并处理</span>
      <span class="hljs-built_in">NSURLSession</span> *session = [<span class="hljs-built_in">NSURLSession</span> sharedSession];
      <span class="hljs-built_in">NSURLSessionDataTask</span> *task = [session dataTaskWithRequest:request completionHandler:^(<span class="hljs-built_in">NSData</span> * _Nullable data, <span class="hljs-built_in">NSURLResponse</span> * _Nullable response, <span class="hljs-built_in">NSError</span> * _Nullable error){
      
          <span class="hljs-comment">//从网络返回了Json数据,我们调用NSJSONSerialization解析它,将JSON数据转换为Foundation对象(这里是一个字典)</span>
          <span class="hljs-keyword">self</span>.dic = [<span class="hljs-built_in">NSJSONSerialization</span> JSONObjectWithData:data options:<span class="hljs-built_in">NSJSONReadingMutableContainers</span> error:<span class="hljs-literal">nil</span>];
          
          <span class="hljs-built_in">NSString</span> *title = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"original_title"</span>];
          <span class="hljs-built_in">NSMutableArray</span> *genresArray = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"genres"</span>];
          <span class="hljs-built_in">NSString</span> *genres = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"%@/%@"</span>, [genresArray objectAtIndex:<span class="hljs-number">0</span>], [genresArray objectAtIndex:<span class="hljs-number">1</span>]];
          <span class="hljs-built_in">NSString</span> *summary = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"summary"</span>];
      
          <span class="hljs-keyword">self</span>.text = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@"</span>, title, genres, summary];
          
          <span class="hljs-comment">//更新UI操作需要在主线程</span>
          <span class="hljs-built_in">dispatch_async</span>(dispatch_get_main_queue(), ^{
              <span class="hljs-keyword">self</span>.textView.text = <span class="hljs-keyword">self</span>.text;
          });
      }];
      <span class="hljs-comment">//调用任务</span>
      [task resume];
    

    });
    }

还是要再提一下,因为涉及到了网络请求,我们在这里用了一点关于使用GCD实现多线程的内容,以后再专门介绍吧。我们运行程序,点击NSJSONSerialization按钮,就看到我们要的内容啦!

SBJson

事实上上面的解析过程还是挺复杂的,主要是牵扯到了NSURLSession的使用。那接下来来看看一些第三方Json解析库的使用。SBJson用起来就简单多了。首先我们去下载这个类库,Github啊,优快云啊,51啊哪里的任何一个地方都有,很好找。下载下来后导入我们的项目就可以直接运行了。有些第三方类库由于年代久远可能是不支持ARC的,SBJson还好,下面那个JsonKit可就不这么和谐了,这个待会再讲。我们这次点击第二个按钮来实现它。为了以示区分,这次我换了一部电影,来看看《移动迷宫2 Maze Runner: The Scorch Trials》吧!

//上面先导入包:
#import "ViewController.h"
#import "SBJson.h"

//实现:

  • (IBAction)SBJson:(UIButton *)sender {
    //GCD异步实现
    dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(q1, ^{

      <span class="hljs-comment">//还是先获取url</span>
      <span class="hljs-built_in">NSURL</span> *url = [<span class="hljs-built_in">NSURL</span> URLWithString:<span class="hljs-string">@"https://api.douban.com/v2/movie/subject/25995508"</span>];
      <span class="hljs-comment">//返回上面url的内容,格式为Json放在了字符串里</span>
      <span class="hljs-built_in">NSString</span> *jsonString = [<span class="hljs-built_in">NSString</span> stringWithContentsOfURL:url encoding:<span class="hljs-built_in">NSUTF8StringEncoding</span> error:<span class="hljs-literal">nil</span>];
      <span class="hljs-comment">//实例化SBJson对象,将Json格式字符串解析,转化为字典。</span>
      SBJsonParser *parser = [[SBJsonParser alloc] init];
      <span class="hljs-keyword">self</span>.dic = [parser objectWithString:jsonString error:<span class="hljs-literal">nil</span>];
          
    
      <span class="hljs-built_in">NSString</span> *title = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"original_title"</span>];
      <span class="hljs-built_in">NSMutableArray</span> *genresArray = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"genres"</span>];
      <span class="hljs-built_in">NSString</span> *genres = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"%@/%@"</span>, [genresArray objectAtIndex:<span class="hljs-number">0</span>], [genresArray objectAtIndex:<span class="hljs-number">1</span>]];
      <span class="hljs-built_in">NSString</span> *summary = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"summary"</span>];
      <span class="hljs-keyword">self</span>.text = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@"</span>, title, genres, summary];
          
      <span class="hljs-comment">//更新UI操作需要在主线程</span>
      <span class="hljs-built_in">dispatch_async</span>(dispatch_get_main_queue(), ^{
          <span class="hljs-keyword">self</span>.textView.text = <span class="hljs-keyword">self</span>.text;
      });
    

    });
    }

看剧情好像很不错呢,打算去看一下~~

JsonKit

事实上,它虽然不支持ARC,但JsonKit是在性能上仅次于苹果原生解析器的第三方类库。我们在导入它的包以后编译会出现一大堆报错,这时候不用慌,我们会发现大部分是ARC的问题,解决方法也挺简单,我们进入项目的Target,找到Build Phases里面的Compile Sources,接着找我们的问题源头JsonKit.m,双击更改它的Compiler Flags标签为“-fno-objc-arc”,再次编译,就好啦~


//上面先导入包:
#import "ViewController.h"
#import "JsonKit.h"

//实现

  • (IBAction)JsonKit:(UIButton *)sender {
    //GCD异步实现
    dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(q1, ^{

      <span class="hljs-comment">//还是先获取url</span>
      <span class="hljs-built_in">NSURL</span> *url = [<span class="hljs-built_in">NSURL</span> URLWithString:<span class="hljs-string">@"https://api.douban.com/v2/movie/subject/26279433"</span>];
      <span class="hljs-built_in">NSString</span> *jsonString = [<span class="hljs-built_in">NSString</span> stringWithContentsOfURL:url encoding:<span class="hljs-built_in">NSUTF8StringEncoding</span> error:<span class="hljs-literal">nil</span>];
      <span class="hljs-comment">//代码越来越简单了有木有!!就一个方法搞定~</span>
      <span class="hljs-keyword">self</span>.dic = [jsonString objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
      
      
      <span class="hljs-built_in">NSString</span> *title = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"original_title"</span>];
      <span class="hljs-built_in">NSMutableArray</span> *genresArray = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"genres"</span>];
      <span class="hljs-built_in">NSString</span> *genres = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"%@/%@"</span>, [genresArray objectAtIndex:<span class="hljs-number">0</span>], [genresArray objectAtIndex:<span class="hljs-number">1</span>]];
      <span class="hljs-built_in">NSString</span> *summary = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"summary"</span>];
      <span class="hljs-keyword">self</span>.text = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@"</span>, title, genres, summary];
      
      <span class="hljs-comment">//更新UI操作需要在主线程</span>
      <span class="hljs-built_in">dispatch_async</span>(dispatch_get_main_queue(), ^{
          <span class="hljs-keyword">self</span>.textView.text = <span class="hljs-keyword">self</span>.text;
      });
    

    });
    }

虽然我们只用了一个方法,但是这可不代表JsonKit类库里就只有这一个解析的方法,我们可以去看看它的源码来找寻一番。一般来讲,如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString方法,这个也比较简单。如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错,这时我们最好使用objectFromJSONStringWithParseOptions也就是我代码里使用的这个方法,因为电影体裁的Value是数组类型的。

这部电影叫《剩者为王》,好可怕。。。

TouchJson

来看看最后一个:

//导入包:
#import "ViewController.h"
#import "CJSONSerializer.h"
#import "CJSONDeserializer.h"

//

  • (IBAction)TouchJson:(UIButton *)sender {
    //GCD异步实现
    dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(q1, ^{

      <span class="hljs-comment">//还是先获取url</span>
      <span class="hljs-built_in">NSURL</span> *url = [<span class="hljs-built_in">NSURL</span> URLWithString:<span class="hljs-string">@"https://api.douban.com/v2/movie/subject/22265299"</span>];
      <span class="hljs-built_in">NSString</span> *jsonString = [<span class="hljs-built_in">NSString</span> stringWithContentsOfURL:url encoding:<span class="hljs-built_in">NSUTF8StringEncoding</span> error:<span class="hljs-literal">nil</span>];
      <span class="hljs-comment">//还是一句话的事儿</span>
      <span class="hljs-keyword">self</span>.dic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:<span class="hljs-built_in">NSUTF8StringEncoding</span>] error:<span class="hljs-literal">nil</span>];
      
      
      <span class="hljs-built_in">NSString</span> *title = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"original_title"</span>];
      <span class="hljs-built_in">NSMutableArray</span> *genresArray = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"genres"</span>];
      <span class="hljs-built_in">NSString</span> *genres = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"%@/%@"</span>, [genresArray objectAtIndex:<span class="hljs-number">0</span>], [genresArray objectAtIndex:<span class="hljs-number">1</span>]];
      <span class="hljs-built_in">NSString</span> *summary = [<span class="hljs-keyword">self</span>.dic objectForKey:<span class="hljs-string">@"summary"</span>];
      <span class="hljs-keyword">self</span>.text = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"电影名称:\n%@\n体裁:\n%@\n剧情简介:\n%@"</span>, title, genres, summary];
      
      <span class="hljs-comment">//更新UI操作需要在主线程</span>
      <span class="hljs-built_in">dispatch_async</span>(dispatch_get_main_queue(), ^{
          <span class="hljs-keyword">self</span>.textView.text = <span class="hljs-keyword">self</span>.text;
      });
    

    });
    }

《绝命海拔 Everest》,冒险类电影,本人不是很感冒,据说是根据真实事件改编的。

Json解析总结

呐,上述四种方式已经很清楚了,从代码量上来看,除了那些废话,原生的解析类库是实现起来最复杂的,其他三种倒是挺简单,通过封装,只对外提供一个简单地接口调用就能实现解析功能,性能上都还可以接受。不过从我亲身提回来讲,觉得JsonKit是里面最快的,可能是代码写的不够好,原生的解析方式如果好好优化一下的话应该是性能最好的。在实际的使用过程中选择一种方式就好。

NSXMLParse

关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象模型。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写)。苹果官方原生的NSXMLParse类库采用第一种方式,即SAX方式解析XML,它基于事件通知的模式,一边读取文档一边解析数据,不用等待文档全部读入以后再解析,所以如果你正打印解析的数据,而解析过程中间出现了错误,那么在错误节点之间的数据会正常打印,错误后面的数据不会被打印。解析过程由NSXMLParserDelegate协议方法回调。

插句题外话先,我在写这种方式解析XML数据的Demo时折腾了整整一天,说起来都有些不好意思了。程序运行的时候一直出现不能完成解析的情况,各种查各种试,真的是整了整整一天的时间。就在崩溃的边缘的时候,我竟然发现在我自己写XML文件时少写了一个“/。。。瞬间感觉整个世界都崩塌了。所以特地记下来警示自己也顺便给大家提个醒,在这种低级失误上浪费整整一天的时间,要多不值有多不值。谨记,谨记。

我们遵循MVC,首先我们创建模型,新建一个person类,存放XML文件中描述的person属性。再来一个解析XML文件的工具类XMLUtil,我们在里面实现文件的获取,代理方法的实现。

先来看这两个类的代码:

//person.h

#import <Foundation/Foundation.h>

@interface person : NSObject
@property (nonatomic, copy) NSString *pid;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *age;
@end

//XMLUtil.h

#import <Foundation/Foundation.h>
#import "person.h"
//声明代理
@interface XMLUtil : NSObject<NSXMLParserDelegate>
//添加属性
@property (nonatomic, strong) NSXMLParser *par;
@property (nonatomic, strong) person *person;
//存放每个person
@property (nonatomic, strong) NSMutableArray *list;
//标记当前标签,以索引找到XML文件内容
@property (nonatomic, copy) NSString *currentElement;

//声明parse方法,通过它实现解析
-(void)parse;
@end



//XMLUtil.m

#import "XMLUtil.h"

@implementation XMLUtil

- (instancetype)init{
    self = [super init];
    if (self) {
        //获取事先准备好的XML文件
        NSBundle *b = [NSBundle mainBundle];
        NSString *path = [b pathForResource:@"test" ofType:@".xml"];
        NSData *data = [NSData dataWithContentsOfFile:path];
        self.par = [[NSXMLParser alloc]initWithData:data];
        //添加代理
        self.par.delegate = self;
        //初始化数组,存放解析后的数据
        self.list = [NSMutableArray arrayWithCapacity:5];
    }
    return self;
}

//几个代理方法的实现,是按逻辑上的顺序排列的,但实际调用过程中中间三个可能因为循环等问题乱掉顺序
//开始解析
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"parserDidStartDocument...");
}
//准备节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
    
    self.currentElement = elementName;
    
    if ([self.currentElement isEqualToString:@"student"]){
        self.person = [[person alloc]init];
        
    }
    
}
//获取节点内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
   
    if ([self.currentElement isEqualToString:@"pid"]) {
        
        [self.person setPid:string];
    }else if ([self.currentElement isEqualToString:@"name"]){
        [self.person setName:string];
    }else if ([self.currentElement isEqualToString:@"sex"]){
        [self.person setSex:string];
    }else if ([self.currentElement isEqualToString:@"age"]){
        
        [self.person setAge:string];
    }
}

//解析完一个节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
    
    if ([elementName isEqualToString:@"student"]) {
        [self.list addObject:self.person];
    }
    self.currentElement = nil;
}

//解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"parserDidEndDocument...");
}

//外部调用接口
-(void)parse{
    [self.par parse];
    
}

@end

OK,总算是大功告成,如果对代理的使用比较熟悉的话,这部分内容其实还蛮简单的。如果被代码转来转去弄晕了的话可以在每个block的最后都加一个打印输出,做好标记,你就能弄懂程序的执行顺序了。

我们点击NSXMLParse,有了!

GDataXML

来看GDataXML,它是一种DOM方式的解析类库。DOM实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。

在使用之前呢,我们还是先从网上下载GDataXML包,里面两个文件GDataXMLNode.h和GDataXMLNode.m导入到项目中来,编译,发现报错了,这是因为GDataXML是依赖libmxl2的,我们要去项目的Target中做一些设置。

  • 找到项目的Tarfet,进入Build Phases里面的Link Binary With Libraries,点击“加号”,搜索libxml,把出现的包添加进去,这里最新版的XCode7和iOS9中,是libxml.2.2.tbd。
  • 再来到Build Settings,我们可以搜索一下,找到Header Search Paths,添加路径“/usr/include/libxml2”。
  • 再找到Other Link Flags,添加“-libxml2“
  • 还有就是如果你下载的GDataXML是不支持ARC的,那么你就要像上面那样去添加“-fno-objc-arc”,这个视你下载的GDataXML包版本而定。

再次编译,就顺利通过了。

接下来看看我们怎么用这个东西。贴代码之前我真的想说一句,比起苹果原生的类库,这些开源的第三方类库真的在用起来的时候不知道有多舒服,懒人必备啊。在实际的开发中可以为我们节省很多的时间与精力,但是还是要搞懂人家原生的东西,这样才叫学会了么。

//ViewController.m
  • (IBAction)GDataXML:(id)sender {

    NSString *path = [[NSBundle mainBundle] pathForResource:@“test” ofType:@“xml”];
    NSData *data = [[NSData alloc]initWithContentsOfFile:path];
    //对象初始化
    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data error:nil];
    //获取根节点
    GDataXMLElement *rootElement = [doc rootElement];
    //获取其他节点
    NSArray *students = [rootElement elementsForName:@“student”];
    //初始化可变数组,用来显示到textView
    self.GDatatext = [[NSMutableString alloc]initWithString:@""];
    for (GDataXMLElement *student in students) {
    //获取节点属性
    GDataXMLElement *pidElement = [[student elementsForName:@“pid”] objectAtIndex:0];
    NSString *pid = [pidElement stringValue];

      GDataXMLElement *nameElement = [[student elementsForName:<span class="hljs-string">@"name"</span>] objectAtIndex:<span class="hljs-number">0</span>];
      <span class="hljs-built_in">NSString</span> *name = [nameElement stringValue];
      
      
      GDataXMLElement *sexElement = [[student elementsForName:<span class="hljs-string">@"sex"</span>] objectAtIndex:<span class="hljs-number">0</span>];
      <span class="hljs-built_in">NSString</span> *sex = [sexElement stringValue];
      
      
      GDataXMLElement *ageElement = [[student elementsForName:<span class="hljs-string">@"age"</span>] objectAtIndex:<span class="hljs-number">0</span>];
      <span class="hljs-built_in">NSString</span> *age = [ageElement stringValue];
      
      <span class="hljs-comment">//调整一下姿势,添加到可变长字符串~~</span>
      <span class="hljs-built_in">NSString</span> *t = [<span class="hljs-built_in">NSString</span> stringWithFormat:<span class="hljs-string">@"学号:%@ 姓名:%@ 性别:%@ 年龄:%@\n"</span>, pid, name, sex, age];
      [<span class="hljs-keyword">self</span>.GDatatext appendString:t];
    

    }
    self.textView.text = self.GDatatext;
    }

就一段,是不是看起来非常的舒服呢!

跑一下,跟我们刚才使用的NSXMLParse是不是一样呢?

哈,搞定!

XML解析总结

上述两种解析用到的类库分别代表了两种典型的XML数据解析方式,SAX和DOM,各有优势,比如在应对比较大数据量的XML文件时,后者由于需要先读取整个文档,性能和速度上就必然不及前者了。

其实现在在实际应用中XML已经越来越少了,但是说起iOS中的网络编程,就免不了和XML格式的数据打交道。还有就是,我们在这里仅仅介绍了两种常用的XML解析方式,如同解析Json数据一样,解析XML文件也有很多种方法,除了上述两种,还有比如像TBXML, TouchXML, KissXML, TinyXML等等,具体的使用方法可以去Github上找,都有使用方法的说明的。

      </div>
    </div>
C#对XML、JSON等格式的解析 C#对XML、JSON等格式的解析一、C#对XML格式数据的解析1、用XMLDocument来解析 XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load("test.xml"); //创建新节点 XmlElement nn = xmlDocument.CreateElement("image"); nn.SetAt 阅读详情

相关推荐

XML解析工具

读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

高效的Xml解析工具

大家在工作中不知道有没有遇到过类似的情况:1、需要写代码解析一个xml文件时,发现需要导入dom4j的jar包,一时又找不到,然后还得浪费几分钟时间去找jar包。2、好不容易找到了jar包,写了一段程序很适合本次使用,但是下次使用的时候还得重新写,代码复用率低。3、从网上找到了一段别人写的解析xml文件的代码,copy下来发现好多地方还得修改才能用。

cz1803472613的博客 8785

XML报文解析工具

适用于STM32任何类型板卡嵌入的XML解析工具,体积小,运算快,是经过多次修改后可以直接植入其他代码框架中的即用型解析工具

解析在线xml

private List> logicsidi(String url) { List> list = new ArrayList>(); try { Document doco; if("http://www.cquae.com/unpub/pros.xml".equals(url) || "http://www.cbex.com.cn/unpub/bj.xml".equals(url))

心疼笔记本 5224

【Pytorch教程】:卷积神经网络 CNN

Pytorch教程目录 Torch and Numpy 变量 (Variable) 激励函数 关系拟合(回归) 区分类型 (分类) 快速搭建法 批训练 加速神经网络训练 Optimizer优化器 卷积神经网络 CNN 目录Pytorch教程目录什么是卷积神经网络 CNN卷积 和 神经网络池化(pooling)流行的 CNN 结构CNN 卷积神经网络MNIST手写数据CNN模型训练可视化训练全部代码 什么是卷积神经网络 CNN 卷积 和 神经网络 卷积神经网络是如何运作的呢, 举一个识别图片的例子, 我们知

nanke_4869的博客 8092

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 397

XML解析及JSON解析

目录 XML 1. XML简介 2. 特性 3. 语法格式 2.主体部分 4. 例子 5. 部分Demo 注意: Demo1: 解析本地 XML文件 Demo2: 解析网络运营商接口返回的XML Demo3: 通过文档对象+xpath,查找本地文件节点 Demo4: 通过文档对象+xpath,查找接口输入流XML中的company节点 Demo5: 循环创建XML节点,生成文件 Demo6: XStream使用 拓展阅读:4种XML解析方法 JSON 1. JSON简介

Guangshan的博客 2892

保姆级教程:Halcon 3D点云匹配与差异分析避坑指南(从采样到可视化)

本文提供了一份详细的Halcon 3D点云匹配与差异分析实战指南,涵盖从模型准备到可视化的全流程。重点解析了STL文件读取单位误区、点云采样密度优化、表面模型创建技巧以及差异分析的专业手法,帮助用户避开常见陷阱,提升工业检测效率与精度。

weixin_33728268的博客 402

Xml 与 JSON 解析

xml 1.XML概述 1.什么是XML? XML (eXtensible Markup Language)指可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。 XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义。您需要自行定义标签。 XML 被设计为具有自我描述性。 XML 是 W3C 的推荐标准 xml是一种非常灵

alwayschw的博客 1790

chmod: changing permissions of `/u01/app/oracle/product/11.2.0/dbhome_1/bin/extjobO‘: Operation not

oracle 11.2.0.4安装psu 29141056,日志末尾抛出报错 Patching component oracle.ctx, 11.2.0.4.0... Applying sub-patch '29141056' to OH '/u01/app/oracle/product/11.2.0/dbhome_1' Patching component oracle.rdbms, 11.2.0.4.0... Patching component oracle.rdbms.rman, 11.2.0.

m0_37625564的博客 1833

MATLAB闪退别慌!5分钟搞定Windows系统预设文件修复(附详细截图)

本文针对MATLAB在Windows系统下频繁闪退的问题,提供了快速有效的解决方案。核心在于修复或重置损坏的MATLAB预设文件,通过图文并茂的五步法,指导用户定位AppData目录、重命名预设文件夹,从而让MATLAB自动生成全新配置以解决闪退。文章还涵盖了问题诊断、设置备份及进阶排查方法,帮助用户彻底根除启动故障。

weixin_29234423的博客 926

XML的解析与JSON解析

XML的解析 XML是一种常见的存储数据方式,在Android平台中内部很多地方都使用了XML存储,如轻量级的SharedPreferences类的存储就是使用的XML文件。 XML解析主要有三种方式,SAX(Simple API for XML),DOM(Document Object Mode)和Android附带的PULL解析器解析XML文件。 优点 缺点 SAX 读取为单...

qq_41951731的博客 1472

从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例

本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。

weixin_29054399的博客 292

XML解析 JSON解析

解析:以约定好的方式,后台开发人员将数据进行存储,前端人员按照对应格式进行数据获取的过程. 数据格式是由后台人员决定,我们无权干涉 当今流行的数据格式:XML和JSON 对于我们来说,数据解析就是根据XML 或者JSON的格式进行数据的读取 XML解析方式主要有两种: SAX解析 和 DOM解析 SAX解析式系统提供的,是根据协议代理回调的方式进行数据的获取 .它在数据解

feiyuyuan_9257的博客 429

ABAP Channels 之 WebSocket 通信实践:用 ABAP Push Channel 打造实时应用

摘要:本文介绍了ABAP Push Channel(APC)技术,它通过WebSocket协议实现ABAP系统与外部客户端的实时双向通信。文章对比了传统HTTP轮询与WebSocket的差异,解释了APC的事件模型及其接口演进(从IF_APC_WS_EXTENSION到IF_APC_WSP_EXTENSION)。通过仓库拣货等实际案例,展示了APC在企业级应用中的价值,如实时监控、协作场景等。文中还详细阐述了ABAP引擎中WebSocket的交互模型,说明其资源优化设计原理,并提供了基础代码示例。该技术解决

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 295

PCIE总线及其PCIE SWITCH的使用

PCIe总线与PCI最大的区别在工作原理上,PCIe是采用点到点的串行方式进行传输的,被称为“串行PCI”,由于采用了串行方式传输使得其工作频率可以达到2.5Ghz,大大增加了传输速率,同时采用全双工的通信方式,使得其传输速度提高了一倍,每一个PCIe总线设备与外部通信时有四根数据总线,分别有两个RX和TX,两根用于发送,两根由于接收。PCIe switch中文翻译为PCIe开关或PCIe交换机,主要作用将PCIe设备互联,PCIe switch芯片与其设备的通信协议都是PCIe;

zxm8513优快云博客 4736

XML和JSON解析

目录 XML语法格式 JSON语法格式 XML解析 JSON解析 一、XML语法格式 1、XML文档声明 <? xml version="1.0" encoding="UTF-8" ?> 2、标记(元素、节点、标签) <标记名称>标记的内容</标记名称> 其中,标记名称命名遵循以下规则: 1)名称可以含字母、数字以及其他的字符, 2)名称不能以数字或者标点符号开始 , 3)名称不能以字符 “xml”(或者 XML、Xml)开始 4)名称不能包含空格,不能包含冒号(:)

weixin_46623319的博客 427

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JSON XML 解析器性能比较

1. JSON 本身的解析器 性能: Jackson > Json-lib*10 可以考虑 jackson 且重用ObjectMapper 的方法获取最高性能; 说明如下:     因为见过有人在使用jackson时,每次都new 一个ObjectMapper的情况,

linhx的专栏 2897

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【Python】轻松解析JSON与XML:Python标准库的json与xml模块

特性JSONXML结构简单的键值对结构标签和属性结构,支持复杂层次可读性易读,结构简洁读写稍复杂,适合结构化数据文件体积通常较小较大,含有标签冗余解析性能快速相对较慢,适合静态数据Python解析模块json应用场景API、配置、轻量级数据交换配置文件、复杂数据存储、文档管理本博客介绍了Python标准库中json和模块的核心功能及应用场景。json模块让我们能够高效处理JSON格式的数据,而提供了XML解析和生成的基本操作。

萧鼎的博客 1781

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

XML与JSON格式数据解析方法

    在网络上传输数据时最常用的格式有两种:XML和JSON,下面就来学习如何解析XML和JSON格式的数据。一、解析XML格式数据    XML格式内容如下:&lt;apps&gt;    &lt;app&gt;        &lt;id&gt;1&lt;/id&gt;        &lt;name&gt;Google Maps&lt;/name&gt;        &lt;versio...

qq_35523015的博客 3197

Android中XML及JSON数据的解析

在Android学习中,掌握各种数据的解析至关重要,这篇博客主要介绍一下XML和JSON两种数据常用的解析方法。 1.xml数据的解析 解析XML格式的数据其实也有许多方式,我们主要介绍两种最常用的,Pull解析和SAX解析。 (1)Pull解析 这里先定义一段XML代码,并对其进行解析 <?xml version="1.0" encoding="utf-8"?> &l...

Healer_LU的博客 541

通过解析xml获得json格式,动态解析json

前几天,公司要实现接口api开放平台,因为涉及到多个关联方。如果用bean存储每个关联方的接口。那会写无数个bean。自己研究了下。实现了一个通过配置xml的对应json格式的文件,然后读取,进行解析json数据。吧对应的数据存到数据库,要用的时候再进行取值。 贴上测试数据 xml文件

s593360340的博客 2596

JavaScript解析JSON及XML

书写AJAX的时候,经常需要解析从服务器返回的一串字符串,这里简单介绍服务器返回字符的两种格式,及JavaScript对它们的解析方法。   一、JSON     即JS对象标记(JavaScript Object Notation),是一种以JS声明对象的方式组合的一串字符串。    JS可以按以下方式定义对象: var obj = { id: 2...

120

XML 与 JSON 数据解析

目录XML解析SAX解析方式DefaultHandler帮助类核心代码pull解析方式解析流程JSON解析Json和xml比较格式规范JSON字符串解析实例核心代码 XML解析 SAX解析方式 顺序扫描,当扫描到文档开始与结束,元素开始与结束的地方通知时间处理函数,解析速度快,占用内存少,解析同步 DefaultHandler帮助类 通过该类中方法判断触发事件 startDocument 当读到文档开始标志时,完成初始化操作 endDocument 文档结束,完成善后 startElem

weixin_51518489的博客 701

【4-8】《XML与JSON》——XML、解析XML、SAX、DOM4J、XStream、JSON、Gson、Fastjson

文章目录XML与JSON一、XML1、XML概述1.XML语法格式2.语法进阶CDATA(了解)2、解析XML1.SAX解析2.DOM解析3.JDOM解析4.DOM4J解析3、DOM4J解析XML(掌握)1.文档对象 Document2.元素对象 Element3.DOM4J解析XML案例4.DOM4J-XPATH解析XML4、Java生成XML(熟悉)5、XStream的使用(了解)二、JSON1、什么是JSON2、JSON解析1.Gson2.Fastjson XML与JSON 一、XML 1、XML概述

程序媛乐园 947

Android之简单的JSON解析和XML解析简介

Android中的解析包括XML解析和JSON解析等,其中XML解析最主要的方法是DOM解析,SAX解析,PULL解析,Android中常用后两种解析。首先来比较一下XML解析和JSON解析的不同之处:     1.JSON和XML的数据可读性基本相同     2.JSON和XML同样拥有丰富的解析手段     3.JSON相对于XML来讲,数据的体积小     4.JSON与JavaSc

cheweilol的专栏 542
上一篇: iOS SDK 打包framework
下一篇: iOS开发-队列和同步异步执行
华丽的跌倒
博客等级 码龄10年 17粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值