iOS xml 解析
本来是喜欢用json的,可服务端的那位大神居然搞不出来
他说他是直接返回一串字符串的,是底层给疯装成xml返回的
嗨,累
网上搜了下,有说用sdk自带的NSXMLParse,
有说用google提供的GDataXML,
还有说用TBXML、KissXML等等的
可是NSXMLParse要实现代理,多出一大堆代码,你就不能解析完给我一个对象就好了?
还有GDataXML,又得加库,又得加头文件路径,关键是没搞成功,看着真是醉了
还有其他的TBXML, KissXML,提供的链接居然没打开=_=!
算了自己组装一个吧
参考:心叶落无痕
http://www.cnblogs.com/xinye/archive/2013/06/16/3138450.html
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;
-(NSString*)description;
@end
XMLElement.m 文件
#import "XMLElement.h"
@implementation XMLElement
-(instancetype)init{
self = [super init];
if (self) {
self.text = @"";
}
return self;
}
-(NSMutableArray*)subElements{
if (_subElements == nil) {
_subElements = [NSMutableArray array];
}
return _subElements;
}
-(NSString*)description{
//属性
NSMutableString* attributesStr = [NSMutableString string];
[self.attributes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[attributesStr appendFormat:@" %@=\"%@\"",key,obj];
}];
//子元素
NSMutableString * subElementsStr = [NSMutableString string];
if (self.subElements.count > 0){
[self.subElements enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"obj%d=%@",idx,obj);
[subElementsStr appendFormat:@"%@",obj];
}];
}
NSString * des = [NSString stringWithFormat:@"<%@%@>%@%@</%@>",self.name,attributesStr,self.text,subElementsStr, self.name];
return des;
}
@end
SBXMLParser.h 文件
#import <Foundation/Foundation.h>
#import "XMLElement.h"
@interface SBXMLParser : NSObject
-(XMLElement*)parserXML:(NSData*)xmlData;
@end
SBXMLParser.m 文件
#import "SBXMLParser.h"
@interface SBXMLParser ()<NSXMLParserDelegate>
// 解析器对象
@property (nonatomic,strong) NSXMLParser *parser;
// 根元素
@property (nonatomic,strong) XMLElement *rootElement;
// 当前的元素
@property (nonatomic,strong) XMLElement *currentElementPointer;
@end
@implementation SBXMLParser
-(XMLElement*)parserXML:(NSData*)xmlData
{
self.parser = [[NSXMLParser alloc]initWithData:xmlData];
self.parser.delegate = self;
if([self.parser parse]){
return self.rootElement;
}
return nil;
}
// 文档开始
-(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
{
NSLog(@"%s",__FUNCTION__);
NSLog(@"elementName=%@, namespaceURI=%@, qName=%@, attributeDict=%@",elementName,namespaceURI,qName,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
{
NSLog(@"%s",__FUNCTION__);
NSLog(@"elementName=%@, namespaceURI=%@,qName=%@",elementName,namespaceURI,qName);
self.currentElementPointer = self.currentElementPointer.parent;
// NSLog(@"end name:%@" , elementName);
}
// 解析文本,会多次解析,每次只解析1000个字符,如果多月1000个就会多次进入这个方法
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"%s",__FUNCTION__);
NSLog(@"string=%@",string);
if([self.currentElementPointer.text length] > 0){
self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string];
}else{
self.currentElementPointer.text = [NSMutableString stringWithString:string];
}
}
@end
File.xml 测试使用的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>
测试方法
void testXMLParser(){
NSString* filepath = [[NSBundle mainBundle] pathForResource:@"File" ofType:@"xml"];
NSLog(@"filepath=%@",filepath);
if ([[NSFileManager defaultManager] fileExistsAtPath:filepath]) {
NSError * error;
NSString * xmlString = [NSString stringWithContentsOfFile:filepath encoding:NSASCIIStringEncoding error:&error];
if (!error) {
NSLog(@"读出:xml=%@",xmlString);
SBXMLParser * parser = [[SBXMLParser alloc] init];
XMLElement * root = [parser parserXML:[xmlString dataUsingEncoding:NSASCIIStringEncoding]];
NSLog(@"解析后:root=%@",root);
}else{
NSLog(@"error=%@",error);
}
}
}
欲知执行效果,请自行测试
我测试的打印结果
2015-03-19 17:16:56.898 SBXMLParser[2092:99396] filepath=/Users/sunward/Library/Developer/CoreSimulator/Devices/F5BAC985-5488-4E15-907B-E4A0210B2A57/data/Containers/Bundle/Application/FB59F175-0389-456E-BAFC-8730483E9099/SBXMLParser.app/File.xml
2015-03-19 17:16:56.900 SBXMLParser[2092:99396] 读出: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>
2015-03-19 17:16:56.901 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.901 SBXMLParser[2092:99396] elementName=root, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.902 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.902 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.902 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.902 SBXMLParser[2092:99396] elementName=person, namespaceURI=(null), qName=(null), attributeDict={
id = 1;
}
2015-03-19 17:16:56.903 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.903 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.903 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.903 SBXMLParser[2092:99396] elementName=firstName, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.917 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.917 SBXMLParser[2092:99396] string=zhang
2015-03-19 17:16:56.918 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.918 SBXMLParser[2092:99396] elementName=firstName, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.918 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.918 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.919 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.919 SBXMLParser[2092:99396] elementName=lastName, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.919 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.919 SBXMLParser[2092:99396] string=sansan
2015-03-19 17:16:56.919 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.920 SBXMLParser[2092:99396] elementName=lastName, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.920 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.920 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.920 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.920 SBXMLParser[2092:99396] elementName=age, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.920 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.921 SBXMLParser[2092:99396] string=21
2015-03-19 17:16:56.921 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.921 SBXMLParser[2092:99396] elementName=age, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.921 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.921 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.922 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.922 SBXMLParser[2092:99396] elementName=person, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.922 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.922 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.922 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.922 SBXMLParser[2092:99396] elementName=person, namespaceURI=(null), qName=(null), attributeDict={
id = 2;
}
2015-03-19 17:16:56.923 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.923 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.923 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.923 SBXMLParser[2092:99396] elementName=firstName, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.923 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.924 SBXMLParser[2092:99396] string=li
2015-03-19 17:16:56.924 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.924 SBXMLParser[2092:99396] elementName=firstName, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.924 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.924 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.925 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.925 SBXMLParser[2092:99396] elementName=lastName, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.925 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.925 SBXMLParser[2092:99396] string=sisisi
2015-03-19 17:16:56.925 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.925 SBXMLParser[2092:99396] elementName=lastName, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.926 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.926 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.926 SBXMLParser[2092:99396] -[SBXMLParser parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-03-19 17:16:56.926 SBXMLParser[2092:99396] elementName=age, namespaceURI=(null), qName=(null), attributeDict={
}
2015-03-19 17:16:56.926 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.926 SBXMLParser[2092:99396] string=31
2015-03-19 17:16:56.927 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.927 SBXMLParser[2092:99396] elementName=age, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.927 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.927 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.927 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.928 SBXMLParser[2092:99396] elementName=person, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.928 SBXMLParser[2092:99396] -[SBXMLParser parser:foundCharacters:]
2015-03-19 17:16:56.928 SBXMLParser[2092:99396] string=
2015-03-19 17:16:56.928 SBXMLParser[2092:99396] -[SBXMLParser parser:didEndElement:namespaceURI:qualifiedName:]
2015-03-19 17:16:56.928 SBXMLParser[2092:99396] elementName=root, namespaceURI=(null),qName=(null)
2015-03-19 17:16:56.929 SBXMLParser[2092:99396] obj0=<firstName>zhang</firstName>
2015-03-19 17:16:56.929 SBXMLParser[2092:99396] obj1=<lastName>sansan</lastName>
2015-03-19 17:16:56.929 SBXMLParser[2092:99396] obj2=<age>21</age>
2015-03-19 17:16:56.929 SBXMLParser[2092:99396] obj0=<person id="1">
<firstName>zhang</firstName><lastName>sansan</lastName><age>21</age></person>
2015-03-19 17:16:56.929 SBXMLParser[2092:99396] obj0=<firstName>zhang</firstName>
2015-03-19 17:16:56.930 SBXMLParser[2092:99396] obj1=<lastName>sansan</lastName>
2015-03-19 17:16:56.930 SBXMLParser[2092:99396] obj2=<age>21</age>
2015-03-19 17:16:56.930 SBXMLParser[2092:99396] obj0=<firstName>li</firstName>
2015-03-19 17:16:56.930 SBXMLParser[2092:99396] obj1=<lastName>sisisi</lastName>
2015-03-19 17:16:56.930 SBXMLParser[2092:99396] obj2=<age>31</age>
2015-03-19 17:16:56.931 SBXMLParser[2092:99396] obj1=<person id="2">
<firstName>li</firstName><lastName>sisisi</lastName><age>31</age></person>
2015-03-19 17:16:56.931 SBXMLParser[2092:99396] obj0=<firstName>li</firstName>
2015-03-19 17:16:56.931 SBXMLParser[2092:99396] obj1=<lastName>sisisi</lastName>
2015-03-19 17:16:56.931 SBXMLParser[2092:99396] obj2=<age>31</age>
2015-03-19 17:16:56.931 SBXMLParser[2092:99396] 解析后:root=<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>