NSXMLParser 解析XML

官方自带XML解析方法NSXMLParser

NSXMLParser  采用SAX方式解析,不支持DOM

github URL:  https://github.com/LiuRuian/ReferenceCode

// ViewController.m 文件


#import "ViewController.h"
#import "UserInfo.h"
#import "UserDetailInfo.h"

@interface ViewController ()<NSXMLParserDelegate]]>

- (IBAction)startXMLParser:(UIButton *)sender;

@property (nonatomic, strong) NSXMLParser *xmlParser;
@property (nonatomic, strong) NSMutableArray *userInfoAttributeArray;
@property (nonatomic, strong) NSMutableArray *userDetailInfoArray;
@property (nonatomic, copy) NSString *currentElement;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self createUserInfoAttributeArray];
    
    // 1. 创建XMLParser
    [self createXMLParser];
}

- (NSMutableArray *)createUserInfoAttributeArray
{
    if (!_userInfoAttributeArray) {
        self.userInfoAttributeArray = [[NSMutableArray alloc] init];
    }
    return self.userInfoAttributeArray;
}



- (NSXMLParser *)createXMLParser
{
    if (!_xmlParser) {
        
        NSString *path = [[NSBundle mainBundle] pathForResource:@"userxml" ofType:@"xml"];
        NSData *data = [NSData dataWithContentsOfFile:path];
        self.xmlParser = [[NSXMLParser alloc] initWithData:data];
        self.xmlParser.delegate = self;
    }
    return self.xmlParser;
}

- (IBAction)startXMLParser:(UIButton *)sender {
    
    // 开始解析
    [self.xmlParser parse];
}

// 1.开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"开始解析文档");
    _userDetailInfoArray = [NSMutableArray new];
}

// 2.遇到开始标签后,调用此方法.  标签内的属性
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
     _currentElement = elementName;
    
    if ([_currentElement isEqualToString:@"user"]) {
        
        // 此处解析的是标签内的属性  attributeDict 属性为一个字典
        // 2.1 模型 接收标签内的属性值
        UserInfo *info = [UserInfo userWitnDict:attributeDict];
        [self.userInfoAttributeArray addObject:info];
        
        UserDetailInfo *detail = [[UserDetailInfo alloc] init];
        [_userDetailInfoArray addObject:detail];
    }
}

// 3.开始解析一组标签内的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    // 3.1 模型 接收标签内的内容
    UserDetailInfo *detail = [_userDetailInfoArray lastObject];
    
    if ([_currentElement isEqualToString:@"username"]) {
        
        detail.username = string;
        
    }else if([_currentElement isEqualToString:@"sex"])
    {
        detail.sex = string;
       
    }else if([_currentElement isEqualToString:@"photourl"])
    {
        detail.photourl = string;
    }
}

// 4. 遇到结束标签后,调用此方法
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    // 一组标签解析结束,对element赋值为空,以便解析下组标签时重新赋值
     _currentElement = nil;
}

// 结束解析温度
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    // 打印解析后标签内的内容
    for (UserDetailInfo *info in self.userDetailInfoArray) {
        
        NSLog(@"username = %@,sex = %@,photourl = %@",info.username,info.sex,info.photourl);
    }
    
    // 打印解析后的标签内的属性内容
    for (UserInfo *info in self.userInfoAttributeArray) {
        NSLog(@"Id = %@,token = %@,phone = %@",info.Id,info.token,info.phone);
    }
}


// 文档出错时触发
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
     NSLog(@"parseError = %@",parseError);
}
@end



----------------------------


// UserInfo 文件 


#import <Foundation/Foundation.h>

@interface UserInfo : NSObject

@property (nonatomic, copy) NSString *Id;
@property (nonatomic, copy) NSString *token;
@property (nonatomic, copy) NSString *phone;

- (id)initWithDict:(NSDictionary *)dict;
+ (id)userWitnDict:(NSDictionary *)dict;

@end





#import "UserInfo.h"

@implementation UserInfo

- (instancetype)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}


+ (instancetype)userWitnDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}

@end





------------------------


// UserDetailInfo  文件



#import <Foundation/Foundation.h>

@interface UserDetailInfo : NSObject
@property (nonatomic, copy) NSString *username;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *photourl;
@end





#import "UserDetailInfo.h"
@implementation UserDetailInfo
@end



--------------------------

XML文件

<?xml version = "1.0" encoding = "UTF-8"?> // 文件声明
<users> //根节点 文件元素, 一组标签,开始标签和结束标签
    <user Id="1" token="101" phone = "18801234567" > // 文件的属性
        <username>张三</username>  // 子节点
        <sex>M</sex>
        <photourl>http://1.com</photourl>
    </user>
    
    <user Id="2" token="101" phone = "18801234567" >
        <username>李四</username>
        <photourl>http://2.com</photourl>
        <sex>F</sex>
    </user>
    <user Id="3" token="101" phone = "18801234567" >
        <username>王五</username>
        <photourl>http://3.com</photourl>
        <sex>M</sex>
    </user>
    <user Id="4" token="101" phone = "18801234567" >
        <username>赵六</username>
        <photourl>http://4.com</photourl>
        <sex>F</sex>
    </user>
</users>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值