XML解析
1. SAX 解析: Simple API for XML 利用代理的三个方法来实现逐行解析
创建:一个类 SAXXMLPaser
SAXXMLPaser.h
//优点: 数据损坏的时候 可以读取未损坏之前的数据
//缺点: 数据写错的时候就会直接结束 不继续解析
@interface SAXXMLPaser : NSObject<NSXMLParserDelegate]] > //xml SAX解析的代理协议
@property (nonatomic,retain)NSString * currentString;//储存每个叶子节点的字符串
@property (nonatomic,retain)NSMutableArray * dataArr;//存储所有的学生对象
//开始解析
- (void)startPaser;
SAXXMLPaser.m
- (instancetype)init
{
self = [super init];
if (self) {
self.dataArr = [NSMutableArray array];
}
return self;
}
- (void)dealloc
{
[self.dataArr release];
[self.currentString release];
[super dealloc];
}
- (void)startPaser
{
//1.获得要解析的数据
NSString * xmlPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];//文件途径
NSData * data = [NSData dataWithContentsOfFile:xmlPath];
//检验是否成功转换成字符串
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//xml SAX解析使用的类
NSXMLParser * xmlPaser = [[NSXMLParser alloc] initWithData:data];
//1.设置代理
xmlPaser.delegate = self;
//2.开始解析
[xmlPaser parse];
}
#warning 当他遇到前面的节点 节点头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@",elementName);
//通过判断节点名 student 来创建学生
if([elementName isEqualToString:@"student"]) {
Student * student = [[Student alloc] init];
//将对象加入到数组中
[self.dataArr addObject:student];
[student release];
}
}
#warning 遇到里面的内容的时候会走这个方法 节点内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"%@",string);
//存储当前的字符串
self.currentString = string;
}
#warning 当遇到后面那个节点的时候调用方法
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
Student * student = [self.dataArr lastObject];
//将字符串
if([elementName isEqualToString:@"name"]) {
student.name = self.currentString;
}
else if ([elementName isEqualToString:@"sex"]) {
student.sex = self.currentString;
}
else if([elementName isEqualToString:@"number"]) {
student.number = [self.currentString integerValue];
}
NSLog(@"%@",elementName);
}
1. DOMXML解析 节点状解析
(1)首先需要使用到第三方的类
GDataXMLNode.h GDataXMLNode.m
// libxml includes require that the target Header Search Paths contain
//
// /usr/include/libxml2
//
// and Other Linker Flags contain
//
// -lxml2
-1.
根据提示搜索
Header Search Paths
添加进去 /usr/include/libxml2
-2.
根据提示搜索
Other Linker Flags
添加进去 -lxml2
(2)
创建一个类
:DOMXMLPaser
DOMXMLPaser.h
- (
void
)startPaser;
@property
(
nonatomic
,
retain
)
NSMutableArray
* dataArr;
DOMXMLPaser.m
- (
instancetype
)init
{
self
= [
super
init
];
if
(
self
) {
self
.
dataArr
= [
NSMutableArray
array
];
}
return
self
;
}
- (
void
)dealloc
{
[
self
.
dataArr
release
];
[
super
dealloc
];
}
- (
void
)startPaser
{
//1.
获取数据
NSString
* domPath = [[
NSBundle
mainBundle
]
pathForResource
:
@"Student"
ofType
:
@"XML"
];
NSData
* data = [
NSData
dataWithContentsOfFile
:domPath];
NSString
* str = [[
NSString
alloc
]
initWithData
:data
encoding
:
NSUTF8StringEncoding
];
NSLog
(
@"%@"
,str);
//2.
解析数据
NSError
* error =
nil
;
//
创建一个错误指针
GDataXMLDocument
* document = [[
GDataXMLDocument
alloc
]
initWithData
:data
options
:
GDataXMLDocumentKind
error
:&error];
if
(error !=
nil
) {
NSLog
(
@"
错误信息
: %@"
,error);
}
//
解析
1.
获得结构的
根节点
GDataXMLElement
* rootElement = [document
rootElement
];
//
解析
2.
获得根节点的子节点
//
根据节点名字获得
NSArray
* arr = [rootElement
elementsForName
:
@"student"
];
//
解析
3.
对数组进行遍历
for
(
GDataXMLElement
* node
in
arr) {
//
对子节点
node
的子节点
name
解析
NSArray
* nameNodes = [node
elementsForName
:
@"name"
];
GDataXMLElement
* nameNode = [nameNodes
lastObject
];
//
将节点转变为字符串
(
这个类自己带的
)
NSString
* name = [nameNode
stringValue
];
NSArray
* sexNodes = [node
elementsForName
:
@"sex"
];
GDataXMLElement
* sexNode = [sexNodes
lastObject
];
NSString
* sex = [sexNode
stringValue
];
NSArray
* numberNodes = [node
elementsForName
:
@"number"
];
GDataXMLElement
* numberNode = [numberNodes
lastObject
];
NSInteger
number = [[numberNode
stringValue
]
integerValue
];
NSLog
(
@"name : %@ sex: %@,number : %d"
,name,sex,number);
}
}
一.JSON解析 不需要创建一个类
//1.
获取文件 参数1:文件名 参数2:文件类型
NSString
* jsonPath = [[
NSBundle
mainBundle
]
pathForResource
:
@"JSON"
ofType
:
@"txt"
];
NSData
* data = [
NSData
dataWithContentsOfFile
:jsonPath];
NSString
* str = [[
NSString
alloc
]
initWithData
:data
encoding
:
NSUTF8StringEncoding
];
NSLog
(
@"%@"
,str);
//2.
解析
NSError
* error =
nil
;
NSMutableArray
* arr = [
NSJSONSerialization
JSONObjectWithData
:data
options
:
NSJSONReadingMutableContainers
error
:&error];
//
将字典或者字符串
转换为
JSON
类型的
// NSJSONSerialization dataWithJSONObject:<#(id)#> options:<#(NSJSONWritingOptions)#> error:<#(NSError **)#>
NSLog
(
@"%@"
,arr);
for
(
NSMutableDictionary
* dic
in
arr) {
Student
* student = [[
Student
alloc
]
init
];
student.
name
= [dic
objectForKey
:
@"name"
];
student.
sex
= [dic
objectForKey
:
@"sex"
];
student.
number
= [[dic
objectForKey
:
@"number"
]
intValue
];
NSLog
(
@"%@ %@ %d"
,student.
name
,student.
sex
,student.
number
);
}