首先新建一个xml文件
<root>
<stu_list>
<stu_array name="A">
<student>
<name>刘喆</name>
<age>18</age>
<tel>120</tel>
</student>
<student>
<name>刘少悔</name>
<age>18</age>
<tel>114</tel>
</student>
</stu_array>
<stu_array name="B">
<student>
<name>攻宁</name>
<age>19</age>
<tel>110</tel>
</student>
<student>
<name>蓝翔</name>
<age>19</age>
<tel>110</tel>
</student>
</stu_array>
</stu_list>
</root>
Sax解析
#import <Foundation/Foundation.h>
@protocol SaxXmlParserProtocol <NSObject>
- (void)sendMessage : (NSArray *)array;
@end
@interface SaxXmlParser : NSObject<NSXMLParserDelegate>
{
NSMutableArray *_stuArray;
}
@property (nonatomic,assign) id<SaxXmlParserProtocol>delegate;
@property (nonatomic,copy) NSString *currentValue;
- (void)startParser;
@end
#import "SaxXmlParser.h"
#import "StuModel.h"
@implementation SaxXmlParser
- (void)dealloc
{
[_currentValue release];
[_stuArray release];
_stuArray = nil;
_currentValue = nil;
[super dealloc];
}
- (id)init
{
self = [super init];
if (self) {
_stuArray = [[NSMutableArray alloc]init];
}
return self;
}
//解析
- (void)startParser
{
//获得xml文件的路径
NSString *sourcePath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
//转换成二进制文件
NSData *data = [NSData dataWithContentsOfFile:sourcePath];
NSXMLParser *par = [[NSXMLParser alloc]initWithData:data];
par.delegate = self;
//开始解析
[par parse];
}
static NSString *kRoot = @"root";
static NSString *kStuArray = @"stu_array";
static NSString *kStudent = @"student";
static NSString *kName = @"name";
static NSString *kAge = @"age";
static NSString *kTel = @"tel";
//实现协议
//开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:kStuArray]) {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic addEntriesFromDictionary:attributeDict];
NSMutableArray *arr = [NSMutableArray array];
[dic setObject:arr forKey:@"array"];
[_stuArray addObject:dic];
}
if ([elementName isEqualToString:kStudent]) {
StuModel *model = [[StuModel alloc]init];
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
[arr addObject:model];
[model release];
}
// NSLog(@"1");
// //第一个参数是哪个解析对象 第二个参数是节点 第五个参数是该字典
// NSLog(@"parser=====%@,didStartElement===%@,namespaceURI====%@,qualifiedName====%@,attributes====%@",parser,elementName,namespaceURI,qName,attributeDict);
}
//结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:kName]) {
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
StuModel *model = [arr lastObject];
model.name = _currentValue;
}
if ([elementName isEqualToString:kAge]) {
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
StuModel *model = [arr lastObject];
model.age = _currentValue;
}
if ([elementName isEqualToString:kTel]) {
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *arr = [dic objectForKey:@"array"];
StuModel *model = [arr lastObject];
model.tel = _currentValue;
}
if ([elementName isEqualToString:kRoot]) {
[self sendMessage];
}
// NSLog(@"2");
// // 第一个参数是解析对象 第二个参数是节点
// NSLog(@"parser===%@,didEndElement==%@,namespaceURI===%@,qualifiedName===%@",parser,elementName,namespaceURI,qName);
}
//取值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//获得值
self.currentValue = string;
// NSLog(@"3");
// //第一个参数是解析对象 第二个参数是要取的值
// NSLog(@"parser==%@,foundCharacters===%@",parser,string);
}
//协议传值
- (void)sendMessage
{
[self.delegate sendMessage:_stuArray];
}
@end
#import <Foundation/Foundation.h>
@interface StuModel : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *age;
@property (nonatomic,copy) NSString *tel;
@end
#import "StuModel.h"
@implementation StuModel
- (void)dealloc
{
[_name release];
[_age release];
[_tel release];
_tel = nil;
_name = nil;
_age = nil;
[super dealloc];
}
- (id)init
{
self = [super init];
if (self) {
}
return self;
}
@end
首先导入第三方文件 GDataXMLNode。h GDataXMLNode。m
然后点击工程 TARGETS下的工程 BuildSetting选下下搜索header 在HeaderSearch Path 下导入第三方文件的路径
#import <UIKit/UIKit.h>
#import "SaxXmlParser.h"
@interface MainViewController : UIViewController<SaxXmlParserProtocol>
@property (nonatomic,retain) NSMutableArray *stuArray;
@end
#pragma mark dom解析
- (void)domParser
{
//获得xml文件的路径
NSString *sourcePath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
//转换成二进制文件
NSData *data = [NSData dataWithContentsOfFile:sourcePath];
NSError *error = nil;
GDataXMLDocument *gdData = [[GDataXMLDocument alloc]initWithData:data options:GDataXMLElementKind error:&error];
GDataXMLElement *xmlElement = [gdData rootElement]; //获得xml中的所有数据
NSArray *array = [xmlElement elementsForName:@"stu_list"]; 获得节点名为stu_list的所有节点 元素类型 GDataXMLElement
GDataXMLElement *stu_list = [array firstObject];
//获得节点名为stu_array的所有节点
NSArray * stuarray = [stu_list elementsForName:@"stu_array"];
for (GDataXMLElement *stuA in stuarray) {
//获得属性名为xx的节点
GDataXMLNode *node = [stuA attributeForName:@"name"];
//取节点属性对应的内容
NSString *attStr = [node stringValue];
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:attStr forKey:@"name"];
NSMutableArray *array = [NSMutableArray array];
[dic setObject:array forKey:@"array"];
[_stuArray addObject:dic];
//获得节点名为xx的所有节点
NSArray *students = [stuA elementsForName:@"student"];
for (GDataXMLElement *stu in students) {
StuModel *model = [[StuModel alloc]init];
[array addObject:model];
[model release];
//获得所有student所有子节点
NSArray *children = [stu children];
for (GDataXMLElement *child in children) {
//取出节点的内容
NSString *childValue = [child stringValue];
//判断节点名
if ([[child name] isEqualToString:@"name"]) {
model.name = childValue;
}
if ([[child name] isEqualToString:@"age"]) {
model.age = childValue;
}
if ([[child name] isEqualToString:@"tel"]) {
model.tel = childValue;
}
}
}
}
NSLog(@"%@",_stuArray);
// NSLog(@"%@",array);
// NSLog(@"%@",xmlElement);
}