1

次のように、複数のパラメーターがタグ内にラップされた状態で、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>

私はNSXMLParserそれを解析するために使用しており、NSLog として各行をコンソールに 1 つずつ吐き出しています。名前を NSString として、ID をNSNumberとして、それぞれをオブジェクト<game>の 1 つにフィードしようとしています。私の NSLog ステートメントのいずれにも返されていません。実際のデータを持つものだけが返されます (各名前、ID など)。Game<game>

各タグ内のすべてのデータを個別のオブジェクトに取得したい場合<game> </game>、どうすればよいですか? パーサーコードは次のとおりです。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    element = [NSMutableString string];
}

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

    NSLog(@"ELEMENT TYPE: %@ VALUE: %@", elementName, element);  

}

4

1 に答える 1

2

まず自分自身を Game クラスにします。XML を解析して Games オブジェクトに変換します。

Game.h のように:

@interface Game : NSObject

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

@end

XML を解析しているクラス (この例では ViewController) で、Game オブジェクトを解析するときに NSMutableArray プロパティを作成し、新しい Game オブジェクトを作成するときに使用する Game プロパティ、現在のオブジェクトを格納する 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.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);
    }
}

解析が終了すると、parserDidEndDocument でコールバックが返されます。この時点で、Games のインスタンスに _games プロパティが設定されます。

于 2012-10-04T20:53:27.437 に答える