Json和XML都属于字符串,用于跨平台,前面总结了下Json,下面看下XML。

XML定义这些百度比我说的清,不再啰嗦,直接代码,我喜欢把东西都放进注释。

一、首先看下要解析的XML内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Users>
  3. <User id="1">
  4. <name>Tom</name>
  5. <age>20</age>
  6. </User>
  7. <User id="2">
  8. <name id = "222">John</name>
  9. <age>33</age>
  10. </User>
  11. <User>
  12. <name id = "333">Eric</name>
  13. <age>43</age>
  14. </User>
  15. <User>
  16. <name id = "444">Tony</name>
  17. <age>54</age>
  18. </User>
  19. </Users>

二、在项目中添加Person类为其添加属性

  1. //
  2. // Person.h
  3. // XmlDemo
  4. //
  5. // Created by City--Online on 15/4/29.
  6. // Copyright (c) 2015年 CYW. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. @interface Person : NSObject
  12.  
  13. @property(nonatomic,strong)NSString *Pid;
  14.  
  15. @property(nonatomic,strong)NSString *Name;
  16.  
  17. @property(nonatomic,assign)int Age;
  18. @end

三、用IOS原生框架来解析XML,注意实现代理

  1. //
  2. // ViewController.m
  3. // XmlDemo
  4. //
  5. // Created by City--Online on 15/4/29.
  6. // Copyright (c) 2015年 CYW. All rights reserved.
  7. //
  8.  
  9. #import "ViewController.h"
  10. #import "Person.h"
  11.  
  12. @interface ViewController () <NSXMLParserDelegate>
  13. @property (nonatomic, strong) NSMutableArray *personArray;
  14. @property (nonatomic, strong) NSMutableString *element;
  15.  
  16. @end
  17.  
  18. @implementation ViewController
  19.  
  20. - (void)viewDidLoad {
  21. [super viewDidLoad];
  22.  
  23. // XML的解析方式有2种
  24. // DOM:一次性将整个XML文档加载进内存,比较适合解析小文件 文档驱动
  25. // SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 事件驱动
  26.  
  27. //IOS自带的属于SAX事件驱动的解析方式
  28. // 就是一个事物模型解析,从头开始读取文档然后根据读取到的头标签,读完头标签后,理论上是读取标签值,然后读取后遇到结束标签等
  29. NSString *path=[[NSBundle mainBundle]pathForResource:@"user" ofType:@"xml"];
  30. NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
  31. //实例化
  32. NSXMLParser *parser=[[NSXMLParser alloc]initWithContentsOfURL:url];
  33. //设置代理
  34. parser.delegate=self;
  35. //开始解析
  36. [parser parse];
  37.  
  38. }
  39. // step1 开始解析
  40. -(void)parserDidStartDocument:(NSXMLParser *)parser
  41. {
  42. self.personArray = [[NSMutableArray alloc] initWithCapacity:0];
  43. self.element = [[NSMutableString alloc] init];
  44. }
  45.  
  46. //step2 开始解析元素 获取头标签的信息<>里面的属性、名字
  47. -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
  48. {
  49. if ([elementName isEqualToString:@"Users"]) {
  50. NSLog(@"进入<Users>");
  51. }
  52. if ([elementName isEqualToString:@"User"]) {
  53. NSLog(@"进入<User>");
  54. Person *user = [[Person alloc] init];
  55. [_personArray addObject:user];
  56. }
  57. if ([elementName isEqualToString:@"name"]) {
  58. NSLog(@"进入<name>");
  59. Person *user = [_personArray objectAtIndex:[_personArray count] -1];
  60. user.Pid = [attributeDict objectForKey:@"id"];
  61. }
  62. if ([elementName isEqualToString:@"age"]) {
  63. NSLog(@"进入<age>");
  64. }
  65.  
  66. }
  67. //step3 获得首尾标签间 > < 的内容
  68. //此处分几种情况:
  69. //1.当标签间内容为“”,如果</></>(如图</age></User></Users>)则进入step4,否则进入step2
  70. //2.当标签间内容不为“”,则进入step4
  71. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  72. {
  73. NSLog(@"%@", string);
  74.  
  75. //获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串)
  76. //这里要赋值为空,目的是为了清空上一次的赋值
  77. [_element setString:@""];
  78. [_element appendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分
  79. }
  80. //step4 标签解析结束</>
  81. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  82. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
  83. // NSLog(@"%@", elementName);
  84. NSString *str=[[NSString alloc] initWithString:_element];
  85.  
  86. if ([elementName isEqualToString:@"Users"]) {
  87. NSLog(@"</Users>= %@",str);
  88. }
  89. if ([elementName isEqualToString:@"name"]) {
  90. NSLog(@"</name>=%@",str);
  91. Person *user = [_personArray objectAtIndex:[_personArray count] -1];
  92. user.Name = str;
  93. }
  94. if ([elementName isEqualToString:@"age"]) {
  95. NSLog(@"</age>=%@",str);
  96. Person *user = [_personArray objectAtIndex:[_personArray count] -1];
  97. user.age = (int)[str integerValue];
  98. }
  99. if ([elementName isEqualToString:@"User"]) {
  100. NSLog(@"</User>=%@ ",str);
  101. }
  102. }
  103. //step5 解析结束
  104. -(void)parserDidEndDocument:(NSXMLParser *)parser
  105. {
  106. for (Person *p in self.personArray) {
  107. NSLog(@"%@ %d %@",p.Name,p.Age,p.Pid);
  108. }
  109. }
  110. //解析报错
  111. -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
  112. {
  113. NSLog(@"解析有误 Error:%@",parseError);
  114.  
  115. }
  116.  
  117. - (void)didReceiveMemoryWarning {
  118. [super didReceiveMemoryWarning];
  119. // Dispose of any resources that can be recreated.
  120. }
  121.  
  122. @end

四、运行结果(显示的内容过长,减少了两个User)

在这里要感谢陈高oliver和袁伟(伟哥)

网络之XML解析-原生的更多相关文章

  1. iOS -数据库网络之xml解析之远程解析XML

    1.IOS中XML文件获取    //设置远程访问地址     NSURL *url=[NSURL URLWithString:@""];       //创建动态URL请求,并初 ...

  2. iOS -数据库网络之xml解析

    XML文件有2种解析方式 1.基于文档(document) 2.基于事件(sax)   1.IOS中XML文件获取   首先要将XML导入工程中 在ViewController的按钮事件中,代码如下: ...

  3. 网络之XML解析-GData

    GDataXML是一套Google使用Objective-C开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询, GDataXML 是 iOS 下的一款轻量级 XML 解 ...

  4. iOS -数据库网络之xml解析之第三方解析XML

    1.导入第三方插件(GDalaXMLNode)   2.第三方插件配置   libxml/tree.h 路径   在项目属性中--Bulid Settings中搜索 Search   --Search ...

  5. [iOS 多线程 & 网络 - 2.3] - 解析xml

    A.XML基本知识 1.xml概念 什么是XML全称是Extensible Markup Language,译作“可扩展标记语言”跟JSON一样,也是常用的一种用于交互的数据格式一般也叫XML文档(X ...

  6. iOS开发网络篇—XML数据的解析

     iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...

  7. QF——网络之JSON解析和XML解析

    JSON解析和XML解析: 用苹果原生的代理方式的网络请求后返回的都是二进制数据(NSData). 若是json,则通过NSJSONSerialization把NSData数据转换为JSON对象. N ...

  8. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  9. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

随机推荐

  1. python3使用ip地址代理

    第一种IP地址代理方式from urllib import request if __name__ == "__main__": # 访问网址 url = 'http://www. ...

  2. UNIGUI换版本注意事项

    比如UNIGUI换版本注意事项 许多人在更换UNIGUI版本时,会遇到各种问题,报各样错.比如下面的: 然后便不知所措,怀疑是UNIGUI新版本有问题——不能安装成功.其实不然. 下面是正确的解决方法 ...

  3. Java框架知识点总结

    一.Struts1的运行原理 在启动时通过前端总控制器ActionServlet加载struts-config.xml并进行解析,当用户在jsp页面发送请求被struts1的核心控制器ActionSe ...

  4. Spring Boot 2 启动时加载properties文件

    每个项目从开发到测试再到上线所需要的各种环境是不同的,这就需要维护相应的配置文件,比如properties或yml文件.有了配置文件后就要考虑如何与应用进行集成. 对于云环境来讲,项目发布需要打成镜像 ...

  5. impress.js 中文注释

    impress.js 中文注释 玄魂 /** * impress.js *(本翻译并未完全遵照原作者的注释翻译) * Impress.js 是受 Prezi启发,基于现代浏览器的 CSS3 与 Jav ...

  6. 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  7. netcore的NLog使用小记

    1. 启动应用程序日志配置 修改Program.cs,在WebHostBuilder构建时配置日志 public static IWebHostBuilder CreateWebHostBuilder ...

  8. 初探日志框架Logback

    一. 背景 最近因为学习项目时需要使用logback日志框架来打印日志, 使用过程中碰到很多的疑惑, 而且需要在控制台打印mybatis执行的sql语句, 于是决定沉下心来 研究一下logback的使 ...

  9. C#6.0语言规范(八) 语句

    C#提供了各种语句.大多数这些语句对于使用C和C ++编程的开发人员来说都很熟悉. statement : labeled_statement | declaration_statement | em ...

  10. Office 2010激活 NO KMS products detected问题

    今天用office2010激活工具Office 2010 Toolkit激活安装的office2010时悲剧的遇到了这个问题,如下图: (这张图是从网上找的,不过和我遇到的问题是一样的). 然后上网搜 ...