网络之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和袁伟(伟哥)


相关文章
|
8天前
|
监控 安全 网络性能优化
|
5天前
|
SQL 安全 网络安全
构筑网络长城:网络安全漏洞解析与防御策略
【4月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、确保数据流通安全和保障用户隐私的关键。本文将深入探讨网络安全的核心问题——安全漏洞,并分享关于加密技术的最新进展以及提升个人和企业安全意识的有效方法。通过对常见网络威胁的剖析,我们旨在提供一套综合性的网络防御策略,以助力读者构建更为坚固的信息安全防线。
|
8天前
|
网络协议 物联网 网络安全
|
5天前
|
安全 算法 网络安全
构筑网络长城:网络安全漏洞解析与防御策略深入理解操作系统:进程管理与调度策略
【4月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、确保数据流通安全和保障用户隐私的关键。本文将深入探讨网络安全的核心问题——安全漏洞,并分享关于加密技术的最新进展以及提升个人和企业安全意识的有效方法。通过对常见网络威胁的剖析,我们旨在提供一套综合性的网络防御策略,以助力读者构建更为坚固的信息安全防线。 【4月更文挑战第30天】 在现代操作系统的核心,进程管理是维持多任务环境稳定的关键。本文将深入探讨操作系统中的进程概念、进程状态转换及进程调度策略。通过分析不同的调度算法,我们将了解操作系统如何平衡各进程的执行,确保系统资源的高效利用和响应时间的最优化。文中不仅剖析了先来先
|
7天前
|
存储 缓存 网络协议
【专栏】DNS服务器是否可以加快我们的网络访问速度
【4月更文挑战第28天】本文探讨了DNS服务器是否能加快网络访问速度。DNS负责将域名转换为IP地址,其查询时间、缓存机制和地理位置都影响网络速度。优化DNS配置,如选择快速的公共DNS服务、使用附近的服务器、确保设备正确配置和利用DNS缓存,都能有效提升网络体验。理解并优化DNS设置对于提高网络速度至关重要。
|
8天前
|
监控 负载均衡 网络协议
|
8天前
|
网络协议 SDN 数据安全/隐私保护
|
8天前
|
网络性能优化 网络虚拟化 数据安全/隐私保护
|
8天前
|
监控 安全 网络虚拟化
|
9天前
|
XML 存储 数据格式
探索 DTD 在 XML 中的作用及解析:深入理解文档类型定义
DTD(文档类型定义)用于定义XML文档的结构和合法元素、属性。它允许不同团体就数据交换标准达成一致,并用于验证XML数据的有效性。DTD可通过内部声明(在XML文档内)或外部声明(在单独文件中)来定义。内部声明示例显示了如何定义`note`元素及其子元素的结构,而外部声明则引用外部DTD文件。元素、属性、实体和PCDATA/CDATA是XML构建模块。DTD中,元素通过ELEMENT声明定义,属性通过ATTLIST声明定义,实体声明提供特殊字符或外部资源的快捷方式。
12 0

推荐镜像

更多