iphonexml反序列化程序

iphonexml反序列化程序,iphone,xml-parsing,xml-deserialization,Iphone,Xml Parsing,Xml Deserialization,我是编程新手,这是我的第一个项目,所以我对xml解析等没有太多概念。 我需要解析一个xml文档,比如 <TLMS><TLMSResponse status="SUCCESS"> <books> <book> <name>abc</name> <author>DEF</author> <publisher>HIJ</publisher> </bo

我是编程新手,这是我的第一个项目,所以我对xml解析等没有太多概念。 我需要解析一个xml文档,比如

<TLMS><TLMSResponse status="SUCCESS">
 <books>
  <book>
   <name>abc</name>
   <author>DEF</author>
   <publisher>HIJ</publisher>
  </book>

  <book>
   <name>xyz</name>
   <author>rus</author>
   <publisher>tuv</publisher>
  </book>
 </books>
</TLMSResponse></TLMS>

abc
DEF
你好
xyz
罗斯
tuv
我已经尝试了很多,但还没有找到任何好的反序列化程序可以解析这个xml并生成“Book”类的对象。 非常感谢您的帮助


谢谢大家

下面是一个实现该协议的示例类

它将解析此xml:

<TLMS><TLMSResponse status="SUCCESS">
<books>
<book>
<name>abc</name>
<author>DEF</author>
<publisher>HIJ</publisher>
</book>

<book>
<name>xyz</name>
<author>rus</author>
<publisher>tuv</publisher>
</book>
</books>
</TLMSResponse></TLMS>
JHXMLParser.h

@protocol JHXMLParserDelegate;

@interface JHXMLParser : NSObject <NSXMLParserDelegate> {
    NSString *ident;

    @private
    id _delegate;
    NSMutableArray *_parsedData;
    NSString *_key;
    NSXMLParser *_dataParser;
    NSString *_previousTag;
    NSString *_currentTag;
    NSMutableString *_elementText;
}

@property (nonatomic, retain) NSString *ident;

- (id)initWithKey:(NSString *)Key andData:(NSData *)data;
// delegate management. The delegate is not retained.
- (id <JHXMLParserDelegate>)delegate;
- (void)setDelegate:(id <JHXMLParserDelegate>)delegate;
- (BOOL)start;

@end

@protocol JHXMLParserDelegate <NSObject>

@optional
- (void)acceptParsedData:(NSMutableArray *)parsedData withIdent:(NSString *)ident;

@end
@协议JHXMLParserDelegate;
@接口JHXMLParser:NSObject{
NSString*ident;
@私人的
身份证代表;
NSMutableArray*_parsedData;
NSString*\u键;
NSXMLParser*_数据解析器;
NSString*\u先前的标签;
NSString*_currentTag;
NSMutableString*_elementText;
}
@属性(非原子,保留)NSString*ident;
-(id)initWithKey:(NSString*)键和data:(NSData*)数据;
//委托管理。委托不被保留。
-(id)代表;
-(void)setDelegate:(id)delegate;
-(BOOL)启动;
@结束
@协议JHXMLParserDelegate
@可选的
-(void)acceptParsedData:(NSMutableArray*)带有ident:(NSString*)ident的parsedData;
@结束
JHXMLParser.m

#import "JHXMLParser.h"

@implementation JHXMLParser

@synthesize ident;

- (id)init {
    if ((self = [super init])) {
        ident = [[NSString alloc] init];
    }
    return self;
}

- (id)initWithKey:(NSString *)key andData:(NSData *)data {
    if ((self = [self init])) {
        _key = key;
        _elementText = [[NSMutableString alloc] initWithString:@""];
        _dataParser = [[NSXMLParser alloc] initWithData:data];
        _dataParser.delegate = self;
    }
    return self;
}

- (id <JHXMLParserDelegate>)delegate {
    id <JHXMLParserDelegate> d = nil;
    if (_delegate) {
        d = _delegate;
    }
    return d;
}
- (void)setDelegate:(id <JHXMLParserDelegate>)delegate {
    _delegate = delegate;
}

- (BOOL)start {
    return [_dataParser parse];
}

- (void)dealloc {
    [ident release];
    [_dataParser release];
    [_parsedData release];
    [_elementText release];
    [_previousTag release];
    [_currentTag release];
    [super dealloc];
}

#pragma mark - NSXMLParser Delegate

- (void)parserDidStartDocument:(NSXMLParser *)parser {
    _parsedData = [[NSMutableArray alloc] init];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    if (_currentTag) {
        [_currentTag release], _currentTag = nil;
    }
    _currentTag = [[NSString alloc] initWithString:elementName];
    if ([elementName isEqualToString:_key]) {
        NSMutableDictionary *tmpDict = [[NSMutableDictionary alloc] init];
        [_parsedData addObject:tmpDict];
        [tmpDict release];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if ([_previousTag isEqualToString:_currentTag]) {
        [_elementText appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    } else {
        if (_elementText) {
            [_elementText release], _elementText = nil;
        }
        _elementText = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    }
    if (![_previousTag isEqualToString:_currentTag]) {
        if (_previousTag) {
            [_previousTag release], _previousTag = nil;
        }
        _previousTag = [[NSString alloc] initWithString:_currentTag];
    }
    [pool drain];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if ([_previousTag isEqualToString:elementName]) {
        [[_parsedData lastObject] setObject:_elementText forKey:elementName];
    } else {
        if (_previousTag) {
            [_previousTag release], _previousTag = nil;
        }
        _previousTag = [[NSString alloc] initWithFormat:@""];
    }
    [pool drain];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSMutableArray *returnData = [[NSMutableArray alloc] initWithArray:_parsedData];
    if ([_delegate respondsToSelector:@selector(acceptParsedData:withIdent:)]) {
        [_delegate acceptParsedData:[returnData autorelease] withIdent:ident];
    } else {
        [returnData release], returnData = nil;
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"********** ERROR Parsing (%@) XML Data! - %@ - %@ **********", ident, [parseError localizedDescription], [parseError localizedFailureReason]);
    if ([_delegate respondsToSelector:@selector(acceptParsedData:withIdent:)]) {
        [_delegate acceptParsedData:_parsedData withIdent:ident];
    }
}

@end
#导入“JHXMLParser.h”
@XmlParser的实现
@综合识别;
-(id)init{
if((self=[super init])){
ident=[[NSString alloc]init];
}
回归自我;
}
-(id)initWithKey:(NSString*)键和数据:(NSData*)数据{
if((self=[self init])){
_钥匙=钥匙;
_elementText=[[NSMutableString alloc]initWithString:@'';
_dataParser=[[NSXMLParser alloc]initWithData:data];
_dataParser.delegate=self;
}
回归自我;
}
-(id)代表{
id d=零;
如果(_代表){
d=_代表;
}
返回d;
}
-(void)setDelegate:(id)delegate{
_代表=代表;
}
-(BOOL)开始{
返回[_dataparserparse];
}
-(无效)解除锁定{
[身份释放];
[_数据解析器发布];
[_parseddatarelease];
[_elementtextrelease];
[_先前的标签发布];
[_CurrentTagRelease];
[super dealoc];
}
#pragma标记-NSXMLParser委托
-(void)parserdistartdocument:(NSXMLParser*)解析器{
_parsedData=[[NSMutableArray alloc]init];
}
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName属性:(NSDictionary*)attributeDict{
如果(_currentTag){
[[u currentTag release],[u currentTag=nil;
}
_currentTag=[[NSString alloc]initWithString:elementName];
if([elementName IsequalString:_key]){
NSMutableDictionary*tmpDict=[[NSMutableDictionary alloc]init];
[[u parsedData addObject:tmpDict];
[tmpDict发布];
}
}
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
if([[u previousTag isEqualToString:[u currentTag]){
[\u elementText appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}否则{
如果(_elementText){
[\u elementText release],\u elementText=nil;
}
_elementText=[[NSMutableString alloc]initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
如果(![\u previousTag isEqualToString:\u currentTag]){
if(_previousTag){
[[u previousTag release],[u previousTag=nil;
}
_previousTag=[[NSString alloc]initWithString:_currentTag];
}
[泳池排水沟];
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
if([\u previousTag isEqualToString:elementName]){
[[[u parsedData lastObject]setObject:[u elementText-forKey:elementName];
}否则{
if(_previousTag){
[[u previousTag release],[u previousTag=nil;
}
_previousTag=[[NSString alloc]initWithFormat:@”“];
}
[泳池排水沟];
}
-(void)parserDidEndDocument:(NSXMLParser*)解析器{
NSMutableArray*returnData=[[NSMutableArray alloc]initWithArray:_parsedData];
if([_delegaterespondstoselector:@selector(acceptParsedData:withIdent:)])){
[_delegateacceptparseddata:[returnData autorelease]with ident:ident];
}否则{
[returnData release],returnData=nil;
}
}
-(void)解析器:(NSXMLParser*)解析器解析错误发生:(NSError*)解析错误{
NSLog(@“*********错误解析(%@)XML数据!-%@-%@**********”,标识,[parseError localizedDescription],[parseError localizedFailureReason]);
if([_delegaterespondstoselector:@selector(acceptParsedData:withIdent:)])){
[_delegateacceptparseddata:_parseddatawith ident:ident];
}
}
@结束

下面是一个实现该协议的示例类

它将解析此xml:

<TLMS><TLMSResponse status="SUCCESS">
<books>
<book>
<name>abc</name>
<author>DEF</author>
<publisher>HIJ</publisher>
</book>

<book>
<name>xyz</name>
<author>rus</author>
<publisher>tuv</publisher>
</book>
</books>
</TLMSResponse></TLMS>
JHXMLParser.h

@protocol JHXMLParserDelegate;

@interface JHXMLParser : NSObject <NSXMLParserDelegate> {
    NSString *ident;

    @private
    id _delegate;
    NSMutableArray *_parsedData;
    NSString *_key;
    NSXMLParser *_dataParser;
    NSString *_previousTag;
    NSString *_currentTag;
    NSMutableString *_elementText;
}

@property (nonatomic, retain) NSString *ident;

- (id)initWithKey:(NSString *)Key andData:(NSData *)data;
// delegate management. The delegate is not retained.
- (id <JHXMLParserDelegate>)delegate;
- (void)setDelegate:(id <JHXMLParserDelegate>)delegate;
- (BOOL)start;

@end

@protocol JHXMLParserDelegate <NSObject>

@optional
- (void)acceptParsedData:(NSMutableArray *)parsedData withIdent:(NSString *)ident;

@end
@协议JHXMLParserDelegate;
@接口JHXMLParser:NSObject{
NSString*ident;
@私人的
身份证代表;
NSMutableArray*_parsedData;
NSString*\u键;
NSXMLParser*_数据解析器;
NSString*\u先前的标签;
NSString*_currentTag;
NSMutableString*_elementText;
}
@属性(非原子,保留)NSString*ident;
-(id)initWithKey:(NSString*)键和data:(NSData*)数据;
//委托管理。委托不被保留。
-(id)代表;
-(void)setDelegate:(id)delegate;
-(BOOL)启动;
@结束
@协议JHXMLParserDelegate
@可选的
-(void)acceptParsedData:(NSMutableArray*)带有ident:(NSString*)ident的parsedData;
@结束
JHXMLParser.m

#import "JHXMLParser.h"

@implementation JHXMLParser

@synthesize ident;

- (id)init {
    if ((self = [super init])) {
        ident = [[NSString alloc] init];
    }
    return self;
}

- (id)initWithKey:(NSString *)key andData:(NSData *)data {
    if ((self = [self init])) {
        _key = key;
        _elementText = [[NSMutableString alloc] initWithString:@""];
        _dataParser = [[NSXMLParser alloc] initWithData:data];
        _dataParser.delegate = self;
    }
    return self;
}

- (id <JHXMLParserDelegate>)delegate {
    id <JHXMLParserDelegate> d = nil;
    if (_delegate) {
        d = _delegate;
    }
    return d;
}
- (void)setDelegate:(id <JHXMLParserDelegate>)delegate {
    _delegate = delegate;
}

- (BOOL)start {
    return [_dataParser parse];
}

- (void)dealloc {
    [ident release];
    [_dataParser release];
    [_parsedData release];
    [_elementText release];
    [_previousTag release];
    [_currentTag release];
    [super dealloc];
}

#pragma mark - NSXMLParser Delegate

- (void)parserDidStartDocument:(NSXMLParser *)parser {
    _parsedData = [[NSMutableArray alloc] init];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    if (_currentTag) {
        [_currentTag release], _currentTag = nil;
    }
    _currentTag = [[NSString alloc] initWithString:elementName];
    if ([elementName isEqualToString:_key]) {
        NSMutableDictionary *tmpDict = [[NSMutableDictionary alloc] init];
        [_parsedData addObject:tmpDict];
        [tmpDict release];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if ([_previousTag isEqualToString:_currentTag]) {
        [_elementText appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    } else {
        if (_elementText) {
            [_elementText release], _elementText = nil;
        }
        _elementText = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    }
    if (![_previousTag isEqualToString:_currentTag]) {
        if (_previousTag) {
            [_previousTag release], _previousTag = nil;
        }
        _previousTag = [[NSString alloc] initWithString:_currentTag];
    }
    [pool drain];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if ([_previousTag isEqualToString:elementName]) {
        [[_parsedData lastObject] setObject:_elementText forKey:elementName];
    } else {
        if (_previousTag) {
            [_previousTag release], _previousTag = nil;
        }
        _previousTag = [[NSString alloc] initWithFormat:@""];
    }
    [pool drain];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSMutableArray *returnData = [[NSMutableArray alloc] initWithArray:_parsedData];
    if ([_delegate respondsToSelector:@selector(acceptParsedData:withIdent:)]) {
        [_delegate acceptParsedData:[returnData autorelease] withIdent:ident];
    } else {
        [returnData release], returnData = nil;
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"********** ERROR Parsing (%@) XML Data! - %@ - %@ **********", ident, [parseError localizedDescription], [parseError localizedFailureReason]);
    if ([_delegate respondsToSelector:@selector(acceptParsedData:withIdent:)]) {
        [_delegate acceptParsedData:_parsedData withIdent:ident];
    }
}

@end
#导入“JHXMLParser.h”
@XmlParser的实现
@综合识别;
-(id)init{
if((self=[super init])){
ident=[[NSString alloc]init];
}