网络之XML解析-原生
Json和XML都属于字符串,用于跨平台,前面总结了下Json,下面看下XML。
XML定义这些百度比我说的清,不再啰嗦,直接代码,我喜欢把东西都放进注释。
一、首先看下要解析的XML内容
<?xml version="1.0" encoding="utf-8"?>
<Users>
<User id="1">
<name>Tom</name>
<age>20</age>
</User>
<User id="2">
<name id = "222">John</name>
<age>33</age>
</User>
<User>
<name id = "333">Eric</name>
<age>43</age>
</User>
<User>
<name id = "444">Tony</name>
<age>54</age>
</User>
</Users>
二、在项目中添加Person类为其添加属性
// // Person.h // XmlDemo // // Created by City--Online on 15/4/29. // Copyright (c) 2015年 CYW. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject @property(nonatomic,strong)NSString *Pid; @property(nonatomic,strong)NSString *Name; @property(nonatomic,assign)int Age; @end
三、用IOS原生框架来解析XML,注意实现代理
//
// ViewController.m
// XmlDemo
//
// Created by City--Online on 15/4/29.
// Copyright (c) 2015年 CYW. All rights reserved.
//
#import "ViewController.h"
#import "Person.h"
@interface ViewController () <NSXMLParserDelegate>
@property (nonatomic, strong) NSMutableArray *personArray;
@property (nonatomic, strong) NSMutableString *element;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// XML的解析方式有2种
// DOM:一次性将整个XML文档加载进内存,比较适合解析小文件 文档驱动
// SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件 事件驱动
//IOS自带的属于SAX事件驱动的解析方式
// 就是一个事物模型解析,从头开始读取文档然后根据读取到的头标签,读完头标签后,理论上是读取标签值,然后读取后遇到结束标签等
NSString *path=[[NSBundle mainBundle]pathForResource:@"user" ofType:@"xml"];
NSURL *url=[[NSURL alloc]initFileURLWithPath:path];
//实例化
NSXMLParser *parser=[[NSXMLParser alloc]initWithContentsOfURL:url];
//设置代理
parser.delegate=self;
//开始解析
[parser parse];
}
// step1 开始解析
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
self.personArray = [[NSMutableArray alloc] initWithCapacity:0];
self.element = [[NSMutableString alloc] init];
}
//step2 开始解析元素 获取头标签的信息<>里面的属性、名字
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"Users"]) {
NSLog(@"进入<Users>");
}
if ([elementName isEqualToString:@"User"]) {
NSLog(@"进入<User>");
Person *user = [[Person alloc] init];
[_personArray addObject:user];
}
if ([elementName isEqualToString:@"name"]) {
NSLog(@"进入<name>");
Person *user = [_personArray objectAtIndex:[_personArray count] -1];
user.Pid = [attributeDict objectForKey:@"id"];
}
if ([elementName isEqualToString:@"age"]) {
NSLog(@"进入<age>");
}
}
//step3 获得首尾标签间 > < 的内容
//此处分几种情况:
//1.当标签间内容为“”,如果</></>(如图</age></User></Users>)则进入step4,否则进入step2
//2.当标签间内容不为“”,则进入step4
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"%@", string);
//获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串)
//这里要赋值为空,目的是为了清空上一次的赋值
[_element setString:@""];
[_element appendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分
}
//step4 标签解析结束</>
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
// NSLog(@"%@", elementName);
NSString *str=[[NSString alloc] initWithString:_element];
if ([elementName isEqualToString:@"Users"]) {
NSLog(@"</Users>= %@",str);
}
if ([elementName isEqualToString:@"name"]) {
NSLog(@"</name>=%@",str);
Person *user = [_personArray objectAtIndex:[_personArray count] -1];
user.Name = str;
}
if ([elementName isEqualToString:@"age"]) {
NSLog(@"</age>=%@",str);
Person *user = [_personArray objectAtIndex:[_personArray count] -1];
user.age = (int)[str integerValue];
}
if ([elementName isEqualToString:@"User"]) {
NSLog(@"</User>=%@ ",str);
}
}
//step5 解析结束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
for (Person *p in self.personArray) {
NSLog(@"%@ %d %@",p.Name,p.Age,p.Pid);
}
}
//解析报错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"解析有误 Error:%@",parseError);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
四、运行结果(显示的内容过长,减少了两个User)

在这里要感谢陈高oliver和袁伟(伟哥)
网络之XML解析-原生的更多相关文章
- iOS -数据库网络之xml解析之远程解析XML
1.IOS中XML文件获取 //设置远程访问地址 NSURL *url=[NSURL URLWithString:@""]; //创建动态URL请求,并初 ...
- iOS -数据库网络之xml解析
XML文件有2种解析方式 1.基于文档(document) 2.基于事件(sax) 1.IOS中XML文件获取 首先要将XML导入工程中 在ViewController的按钮事件中,代码如下: ...
- 网络之XML解析-GData
GDataXML是一套Google使用Objective-C开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询, GDataXML 是 iOS 下的一款轻量级 XML 解 ...
- iOS -数据库网络之xml解析之第三方解析XML
1.导入第三方插件(GDalaXMLNode) 2.第三方插件配置 libxml/tree.h 路径 在项目属性中--Bulid Settings中搜索 Search --Search ...
- [iOS 多线程 & 网络 - 2.3] - 解析xml
A.XML基本知识 1.xml概念 什么是XML全称是Extensible Markup Language,译作“可扩展标记语言”跟JSON一样,也是常用的一种用于交互的数据格式一般也叫XML文档(X ...
- iOS开发网络篇—XML数据的解析
iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...
- QF——网络之JSON解析和XML解析
JSON解析和XML解析: 用苹果原生的代理方式的网络请求后返回的都是二进制数据(NSData). 若是json,则通过NSJSONSerialization把NSData数据转换为JSON对象. N ...
- iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)
一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...
- iOS网络-02-数据解析(JSON与XML)
数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...
随机推荐
- hive 函数 current_date()
current_date() 获取当天时间 select current_date() 结果是 实际操作中,这种写法只能获取日期是今天的数据,不适合数据重跑. 更合适的写法是 ,将日期作为外部参数传 ...
- [require-js]向下滑动ajax加载的javascript实现
define(function(){ function ScrollMoreInfo($wraper , loadDataFunc , json_ids , perNum , tpl_info) { ...
- .net core Area独立成单独的dll文件
以前做MES项目遇到过这个情况,一个项目有7到8个大模块,生产.质量.物耗.电子看板.设备等,每个模块都有大量业务,这样使用mvc结构如果所有模块放在一个目录中,那么势必会产生很多问题,各模块代码不好 ...
- kls与flag(map)
题目传送门 这道题还挺搞笑的,\(map\)常数贼大还是把它水过了. 可以发现这道题求的是 \((j>i)j-i=h_i+h_j,j-i=|h_i-h_j|\)的对数. 那么显然,因为高度大于\ ...
- 04_python_列表
一.列表 列表是用[ ]括起来并每个元素用逗号分割的,并且可以存放各种数据类型,存放的数据量非常大,列表是有序的(按照你保存的顺序),有索引, 可以切片方便取值. lst = [1, '哈哈', &q ...
- Python 生成器的使用(yield)
一. 生成器就是一个特殊的迭代器, 使用关键字yield就可以生成一个生成器 def func(): for i in range(10): yield i item = func() yield i ...
- Android逆向进阶—— 脱壳的奥义(基ART模式下的dump)
本文作者:i春秋作家HAI_ZHU 0×00 前言 市面上的资料大多都是基于Dalvik模式的dump,所以这此准备搞一个ART模式下的dump.HAI_的使用手册(各种好东西) Dalvik模式是A ...
- css3中那些鲜为人知但又很有用的属性
概述 这是我在写移动端页面的时候遇到的,css3中鲜为人知但又很有用的属性,记录下来,供以后开发时参考,相信对其他人也有用. tap-highlight-color 在移动端开发中,我们需要在用户轻按 ...
- 【UML】:时序图
时序图表达了类之间调用关系,以及调用时序关系. Actor: 调用者实例化类的对象,执行者. Lifeline: 生命线,竖的虚线.上方方框是类名表示存在的时间,从上至下表示时间流逝.Lifeline ...
- linux服务器的相关信息查看(端口占用,cpu、内存占用,防火墙,系统信息,vim编辑器使用等)
一.端口占用情况 https://www.cnblogs.com/CEO-H/p/7794306.html (1)查看所有端口.进程的使用情况:netstat -tunlp (2)查看某一端口的使 ...