网络之XML解析-原生

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

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


相关文章
|
2天前
|
安全 网络安全 数据安全/隐私保护
数字堡垒:网络安全漏洞、加密技术与安全意识的深度解析
【7月更文挑战第25天】在数字化时代的浪潮中,网络安全已成为维护个人隐私和企业资产的关键防线。本文深入探讨了网络安全的三大支柱:网络漏洞识别与防护机制、先进的加密技术以及培养全民网络安全意识的重要性。通过分析最新的网络攻击案例、评估不同加密算法的优劣,并讨论如何通过教育提升公众的安全防范意识,旨在为读者提供一个全面的网络安全知识框架,从而在日益复杂的网络环境中保持警觉和保护。
|
3天前
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞、加密技术与安全意识的深度解析
本文将深入探讨网络安全漏洞、加密技术以及安全意识的重要性和影响。我们将从网络安全漏洞的定义、类型及其产生的原因开始,然后详细解析加密技术的工作原理、种类及其在保护信息安全中的作用。最后,我们将讨论安全意识的重要性,以及如何通过提高公众的安全意识来防止网络攻击。
11 3
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
大多数浏览器内置XML解析器,将XML转化为JavaScript可访问的XML DOM对象。XML DOM提供遍历、访问、插入和删除节点的功能。文档须先加载至DOM。示例代码通过XMLHTTP请求加载`books.xml`,兼容多种浏览器,响应设置为XML DOM用于后续处理。
|
4天前
|
XML Web App开发 JavaScript
XML DOM 解析器
**XML DOM解析器将XML转换为JS对象,便于操作。浏览器内置XML解析器,通过XMLHttpRequest或ActiveXObject加载XML如&quot;books.xml&quot;。
|
9天前
|
网络协议 程序员
TCP报文格式全解析:网络小白变高手的必读指南
**TCP报文格式详解摘要** 探索TCP,传输层的关键协议,提供可靠数据传输。报文含源/目的端口(标识应用),32位序号(跟踪字节顺序),确认序号(确认接收),4位首部长度,6位标志(URG, ACK, PSH, RST, SYN, FIN),窗口大小(流量控制),检验和(数据完整性),紧急指针(优先数据)及可变长选项(如MSS, 时间戳)。了解这些字段,能更好地理解TCP连接的建立、管理和数据交换。
23 3
|
2天前
|
XML Web App开发 JavaScript
XML DOM 解析器
Most browsers have a built-in XML parser to create an XML DOM object from XML, making it accessible via JavaScript. The XML DOM includes methods for navigating, accessing, inserting, and deleting nodes in the XML tree.
|
7天前
|
XML Web App开发 JavaScript
XML DOM 解析器
**XML DOM解析器**在浏览器中内置,将XML转换为可操作的对象。通过遍历、访问和修改节点来处理XML。首先,XML文档加载到DOM对象,如JavaScript的`responseXML`属性所示。
|
1月前
|
XML Java 数据格式
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
深度解析 Spring 源码:从 BeanDefinition 源码探索 Bean 的本质
36 3
|
22天前
|
存储 安全 Java
深度长文解析SpringWebFlux响应式框架15个核心组件源码
以上是Spring WebFlux 框架核心组件的全部介绍了,希望可以帮助你全面深入的理解 WebFlux的原理,关注【威哥爱编程】,主页里可查看V哥每天更新的原创技术内容,让我们一起成长。

推荐镜像

更多