利用NSXMLParser封装成独立的XML解析类

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);

        }


        

    }

}


欲知执行效果,请自行测试

这里demo下载


我测试的打印结果

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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值