【IOS中XML解析】NSXMLParser方法解析XML文件案例
来源:互联网 发布:grub没有windows 编辑:程序博客网 时间:2024/05/21 12:50
IOS 中的XML解析
首先说一下,在IOS中XML解析和在Android中的SAX或者Pull解析差别不大,都是基于事件的解析方式。
首先,定义一个对象来表示XML的文档结构
XMLElement.h
#import <Foundation/Foundation.h>
@interface XMLElement : NSObject
// 标签名称
@property (nonatomic,strong) NSString *name;
// 标签的文本(注意在上一级标签和下一级标签之间室友文本的)
@property (nonatomic,strong) NSString *text;
// 标签的属性
@property (nonatomic,strong) NSDictionary *attributes;
// 子标签集合
@property (nonatomic,strong) NSMutableArray *subElements;
// 上一级标签
@property (nonatomic,strong) XMLElement *parent;
@end
XMLElement.m
#import "XMLElement.h"
@implementation XMLElement
@synthesize name,text,attributes,subElements,parent;
-(NSMutableArray *) subElements
{
if(subElements == nil){
subElements = [[NSMutableArray alloc]init];
}
return subElements;
}
@end
XML文件的内容放在/Supporting File/的Group下面。名称为person.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<person id="1">
<firstName>zhang</firstName>
<lastName>sansan</lastName>
<age>21</age>
</person>
<person id="2">
<firstName>li</firstName>
<lastName>sisisi</lastName>
<age>31</age>
</person>
</root>
解析的ViewController.h
#import <UIKit/UIKit.h>
#import "XMLElement.h"
@interface ViewController : UIViewController <NSXMLParserDelegate>
// 解析器对象
@property (nonatomic,strong) NSXMLParser *parser;
// 根元素
@property (nonatomic,strong) XMLElement *rootElement;
// 当前的元素
@property (nonatomic,strong) XMLElement *currentElementPointer;
@end
解析的ViewController.m
#import "ViewController.h"
#import "UIColor+ColorWithARGB.h"
@interface ViewController ()
@end
@implementation ViewController
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self != nil){
self.title = @"XML解析";
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor r:0xA5 g:0xA5 b:0x52];
NSString *xmlFilePath = [[NSBundle mainBundle]pathForResource:@"person"ofType:@"xml"];
NSData *data = [[NSData alloc]initWithContentsOfFile:xmlFilePath];
self.parser = [[NSXMLParser alloc]initWithData:data];
self.parser.delegate = self;
if([self.parser parse]){
NSLog(@"The XML is Parsed");
NSMutableString *str = [[NSMutableString alloc]init];
[str appendFormat:@"%@\n",self.rootElement.name];
NSMutableArray *subs = self.rootElement.subElements;
for(int i = 0;i < [subs count];i++){
XMLElement *personElement = [subs objectAtIndex:i];
[str appendFormat:@"\tname:%@",personElement.name];
[str appendFormat:@",text:%@\n",personElement.text];
NSArray *subPersonElements = personElement.subElements;
for(int j = 0;j < [subPersonElements count];j++){
XMLElement *subElement = [subPersonElements objectAtIndex:j];
[str appendFormat:@"\t\tname:%@",subElement.name];
[str appendFormat:@",text:%@\n",subElement.text];
}
}
NSLog(@"======解析结果:%@" ,str);
}else{
NSLog(@"Failed to parse the XML");
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
// 文档开始
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
self.rootElement = nil;
self.currentElementPointer = nil;
}
// 文档结束
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
self.currentElementPointer = nil;
}
// 元素开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if(self.rootElement == nil){
self.rootElement = [[XMLElement alloc]init];
self.currentElementPointer = self.rootElement;
}else{
XMLElement *newElement = [[XMLElement alloc]init];
newElement.parent = self.currentElementPointer;
[self.currentElementPointer.subElements addObject:newElement];
self.currentElementPointer = newElement;
}
self.currentElementPointer.name = elementName;
self.currentElementPointer.attributes = attributeDict;
NSLog(@"name:%@" , elementName);
}
// 元素结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
self.currentElementPointer = self.currentElementPointer.parent;
NSLog(@"end name:%@" , elementName);
}
// 解析文本,会多次解析,每次只解析1000个字符,如果多月1000个就会多次进入这个方法
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if([self.currentElementPointer.text length] > 0){
self.currentElementPointer.text = [self.currentElementPointer.textstringByAppendingString:string];
}else{
self.currentElementPointer.text = [NSMutableString stringWithString:string];
}
NSLog(@"string:%@" , string);
}
@end
- 【IOS中XML解析】NSXMLParser方法解析XML文件案例
- ios NSXmlparser方法 XML解析
- iOS XML解析 - NSXMLParser
- ios-使用NSXMLParser解析XML文件
- iOS SDK中使用NSXMLParser解析XML
- iOS SDK中使用NSXMLParser解析XML
- iOS SDK中使用NSXMLParser解析XML
- 【ios】通过NSXMLParser解析xml
- IOS内置NSXMLParser解析xml
- iOS-XML文档解析(NSXMLParser)
- iphone NSXMLParser解析xml文件
- 使用NSXMLParser解析xml文件
- 使用NSXMLParser解析xml文件
- iOS 详解NSXMLParser方法解析XML数据方法
- IOS 详解NSXMLParser方法解析XML数据方法
- iOS 详解NSXMLParser方法解析XML数据方法
- IOS开发之—xml文件解析(NSXMLParser类)
- NSXMLParser解析xml
- VC++下载文件线程 有进度条 百分比
- Yii快速入门教程
- 阿里巴巴集团去IOE运动的思考与总结
- IOCP底层,支持超过15000个连接
- 微软发补丁修复Win8.1安全启动水印Bug
- 【IOS中XML解析】NSXMLParser方法解析XML文件案例
- hdu 4474
- 对mysql explain讲的比较清楚的
- Cannot assign "u'1'": "Vote.design" must be a "Design" instance.
- CentOS 下安装 Ganglia的学习笔记整理
- CFS 调度器学习笔记
- jqGrid查询显示中文乱码问题的解决
- 做一个思考者系列之--编程这件事(手稿版)
- NSArray NSMutableArray NSString NSMutableString NSDictionary NSMutableDictionary常用增删查改