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解析-原生的更多相关文章

  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. 7.代理handler

    简单的自定义opener() import urllib.request #构建一个HTTPHandler处理器对象,支持处理HTTP请求 http_handler=urllib.request.HT ...

  2. 1.虚拟机中安装ubuntu

    1.VMware安装很简单,全部默认安装即可. 2.安装完VMware之后,打开VMware,点击创建虚拟机 典型安装易出问题,所以这里选择自定义安装 安装过程选项配置如下 处理器数,核数,内存都可以 ...

  3. 纯净得只剩下字的访问IP查询API

    纯净得只剩下字的访问IP查询API 实用资源 / 2018-02-26 / 3 条评论 看到一个好玩的,就随手收藏一下,本API作用:获取用户真实IP,而获取用户IP常见的坑有两个,开发支付的时候也需 ...

  4. DevExpress控件cxGrid实现多列模糊匹配输入的完美解决方案

    本方案不需要修改控件源码,是完美解决cxgrid或TcxDBExtLookupComboBox支持多列模糊匹配快速输入的最佳方案!! 转自https://blog.csdn.net/qq5643020 ...

  5. linux 下查看redis内存等占用量

    用客户端连接redis服务器:  ./redis-cli -h ip :port >>info server : 一般 Redis 服务器信息,包含以下域: redis_version : ...

  6. OC中双向链表的实现

    双向链表的概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都 ...

  7. SQL面试题之行转列

    典型的课程表: mysql> select * from course; +----+------------+----------+------------+ | id | teacher_i ...

  8. 【xsy2504】farm 容斥原理

    题目大意:给你三个数$n,m,s$,满足$n,m,s≤10^{18}$且最大质因数均不大于$10^6$. 问你存在多少个整数$k$,满足$0≤k≤m$,且$(k,0)$,$(0,n)$,$(x,y)$ ...

  9. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

  10. MySQL命令行登陆,远程登陆MySQL

    注: MySQL图形界面管理工具[navicat 10.1.8中文绿色版] 下载地址:http://www.t00y.com/file/18393836 备用地址:http://ProCircle.q ...