2011-10-19 1 views
1

XML ...아이폰 내가 프로그래밍에 새로운 오전이 그래서 난 등 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> 

I 많이 시도했지만이 XML을 구문 분석하고 "Book"클래스의 객체를 만들 수있는 좋은 de-serializer를 찾지 못했습니다. 어떤 도움을 크게

당신에게 모든

답변

1

감사 ... 감사합니다 여기에 NSXMLParserDelegate 프로토콜을 구현하는 예 클래스입니다.

그것은이 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> 

각 사전은 각 태그의 키를 사용하여 XML에서 "책"과 키에 대한 값으로 해당 태그 사이의 텍스트는 . 사전을 만드는 나는 이미 클래스가

array = 
(
    { 
     name:"abc", 
     author:"DEF", 
     publisher:"HIJ", 
    }, 
    { 
     name:"xyz", 
     author:"rus", 
     publisher:"tuv", 
    }, 
) 

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 

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 
+0

을 : 그래서이 [_delegate acceptParsedData:[returnData autorelease] withIdent:ident];returnData의 모습 어떻게 xml에서 끝내지만 명시 적으로 deserial을 만들려면 내 편에서 요구 될 것입니다. izer를 구문 분석 할 각 클래스에 대한 izer ... 그 사전을 Book 클래스의 객체로 변환하는 메소드를 작성해야합니다. –