Objective c 将XML导入自定义对象?

Objective c 将XML导入自定义对象?,objective-c,xml,nsxmlparser,Objective C,Xml,Nsxmlparser,我从web查询中返回了一些XML,其中多个参数封装在一个标记中,如下所示: <game> <name>First game title</name> <id>12345</id> <desc>A game..</desc> </game> <game> <name>Second game title</name> <id

我从web查询中返回了一些XML,其中多个参数封装在一个标记中,如下所示:

<game>
    <name>First game title</name>
    <id>12345</id>
    <desc>A game..</desc>
</game>
<game>
    <name>Second game title</name>
    <id>67890</id>
    <desc>Another game..</desc>
</game>

}

首先让自己成为一名游戏职业。我们将把XML解析成游戏对象

游戏。h喜欢这样:

@interface Game : NSObject

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSNumber *gameID;
@property (nonatomic, retain) NSString *gameDescription;

@end
现在,在您正在解析XML的类中(在本例中为ViewController),创建一个NSMutableArray属性以在解析游戏对象时存储它们,创建新游戏对象时使用的游戏属性,一个NSString属性以在XML中存储我们正在解析的当前元素,以及一个用于我们正在使用的NSXMLParser实例的属性。还要确保它符合NSXMLParserDelegate协议

因此,标题ViewController.h:

@interface ViewController : UIViewController <NSXMLParserDelegate>

@property (nonatomic, retain) NSString *currentElement;
@property (nonatomic, retain) NSMutableArray *games;
@property (nonatomic, retain) Game *gameBeingParsed;
@property (nonatomic, retain) NSXMLParser *xmlParser;

@end
@界面ViewController:UIViewController
@属性(非原子,保留)NSString*currentElement;
@属性(非原子,保留)NSMutableArray*游戏;
@属性(非原子,保留)Game*gameBeingParsed;
@属性(非原子,保留)NSXMLParser*xmlParser;
@结束
现在在实现ViewController.m中,我们解析XML:

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Make an NSMutableArray to put the parsed Game objects in
    self.games = [NSMutableArray array];

    // Get the XML data to parse
    // We need it in an NSdata object
    NSString *xmlString = @"<?xml version=\"1.0\" encoding=\"utf-8\"?><xml><game><name>First game title</name><id>12345</id><desc>A game..</desc></game><game><name>Second game title</name><id>67890</id><desc>Another game..</desc></game></xml>";
    NSData *xmlData = [xmlString dataUsingEncoding:NSStringEncodingConversionAllowLossy];

    // Set up an NSXMLParser to use
    // Set the delegate and start parsing!
    self.xmlParser = [[[NSXMLParser alloc] initWithData:xmlData] autorelease];
    _xmlParser.delegate = self;
    [_xmlParser parse];


}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {

    // If we have a <game> tag then we are starting to parse a new Game object
    if ([elementName isEqualToString:@"game"]) {
        self.gameBeingParsed = [[[Game alloc] init] autorelease];
    }

    // If not then we need to keep track of the element name so we know which property to set on the Game object
    else {
        self.currentElement = elementName;
    }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    // If we have a closing </game> tag we are done parsing a Game so add it to the array
    if ([elementName isEqualToString:@"game"]) {
        [_games addObject:_gameBeingParsed];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    // Work out which element we have the characters for
    // Then set the property of the Game object
    if ([_currentElement isEqualToString:@"name"]){
        _gameBeingParsed.name = string;
    }
    if ([_currentElement isEqualToString:@"id"]){
        _gameBeingParsed.gameID = [NSNumber numberWithInt:[string intValue]];
    }
    if ([_currentElement isEqualToString:@"name"]){
        _gameBeingParsed.gameDescription = string;
    }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser{

    // We are done parsing XML
    NSLog(@"Parsed %d Games", _games.count);
    for (Game *game in _games) {
        NSLog(@"%@ : %@ : %@", game.name, game.gameID, game.gameDescription);
    }
}
#导入“ViewController.h”
@实现视图控制器
-(无效)viewDidLoad
{
[超级视图下载];
//制作一个NSMutableArray,将解析后的游戏对象放入其中
self.games=[NSMutableArray];
//获取要解析的XML数据
//我们需要在NSdata对象中使用它
NSString*xmlString=@“第一个游戏标题12345A游戏..第二个游戏标题67890另一个游戏..”;
NSData*xmlData=[xmlString dataUsingEncoding:nsstringencodingconversionlowlossy];
//设置要使用的NSXMLParser
//设置委托并开始解析!
self.xmlParser=[[NSXMLParser alloc]initWithData:xmlData]autorelease];
_xmlParser.delegate=self;
[_xmlparserparse];
}
-(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName属性:(NSDictionary*)attributeDict{
//如果我们有一个标签,那么我们开始解析一个新的游戏对象
if([elementName IsequalString:@“game”]){
self.gameBeingParsed=[[[Game alloc]init]autorelease];
}
//如果没有,那么我们需要跟踪元素名称,以便知道在游戏对象上设置哪个属性
否则{
self.currentElement=elementName;
}
}
-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
//如果我们有一个结束标记,我们就完成了对游戏的解析,所以将它添加到数组中
if([elementName IsequalString:@“game”]){
[\u games addObject:\u gamesbeingparsed];
}
}
-(void)解析器:(NSXMLParser*)解析器查找字符:(NSString*)字符串
{
//找出我们有哪些元素的字符
//然后设置游戏对象的属性
if([\u currentElement IsequalString:@“name”]){
_gameBeingParsed.name=字符串;
}
if([\u currentElement IsequalString:@“id”]){
_gameBeingParsed.gameID=[NSNumber numberWithInt:[string intValue]];
}
if([\u currentElement IsequalString:@“name”]){
_gameBeingParsed.gameDescription=字符串;
}
}
-(void)parserDidEndDocument:(NSXMLParser*)解析器{
//我们已经完成了XML解析
NSLog(@“已解析%d个游戏”,_Games.count);
用于(游戏*游戏中的游戏){
NSLog(@“%@:%@:%@”、game.name、game.gameID、game.gameDescription);
}
}

解析完成后,我们在parserDidEndDocument中得到一个回调:此时,将填充_games属性,以创建游戏实例。

我的解释有意义吗?我意识到我基本上只是为了回应而转储了一堆代码,所以我也尝试添加一些解释。
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Make an NSMutableArray to put the parsed Game objects in
    self.games = [NSMutableArray array];

    // Get the XML data to parse
    // We need it in an NSdata object
    NSString *xmlString = @"<?xml version=\"1.0\" encoding=\"utf-8\"?><xml><game><name>First game title</name><id>12345</id><desc>A game..</desc></game><game><name>Second game title</name><id>67890</id><desc>Another game..</desc></game></xml>";
    NSData *xmlData = [xmlString dataUsingEncoding:NSStringEncodingConversionAllowLossy];

    // Set up an NSXMLParser to use
    // Set the delegate and start parsing!
    self.xmlParser = [[[NSXMLParser alloc] initWithData:xmlData] autorelease];
    _xmlParser.delegate = self;
    [_xmlParser parse];


}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {

    // If we have a <game> tag then we are starting to parse a new Game object
    if ([elementName isEqualToString:@"game"]) {
        self.gameBeingParsed = [[[Game alloc] init] autorelease];
    }

    // If not then we need to keep track of the element name so we know which property to set on the Game object
    else {
        self.currentElement = elementName;
    }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    // If we have a closing </game> tag we are done parsing a Game so add it to the array
    if ([elementName isEqualToString:@"game"]) {
        [_games addObject:_gameBeingParsed];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    // Work out which element we have the characters for
    // Then set the property of the Game object
    if ([_currentElement isEqualToString:@"name"]){
        _gameBeingParsed.name = string;
    }
    if ([_currentElement isEqualToString:@"id"]){
        _gameBeingParsed.gameID = [NSNumber numberWithInt:[string intValue]];
    }
    if ([_currentElement isEqualToString:@"name"]){
        _gameBeingParsed.gameDescription = string;
    }
}

- (void)parserDidEndDocument:(NSXMLParser *)parser{

    // We are done parsing XML
    NSLog(@"Parsed %d Games", _games.count);
    for (Game *game in _games) {
        NSLog(@"%@ : %@ : %@", game.name, game.gameID, game.gameDescription);
    }
}