iphonexml反序列化程序
我是编程新手,这是我的第一个项目,所以我对xml解析等没有太多概念。 我需要解析一个xml文档,比如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
<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];
}