0

次の情報を含むxmlファイルがあります。

<?xml version="1.0"?>
-<Party> 
-<Player> 
<Name>Butch</Name> 
<Level>1</Level> 
<Class>Fighter</Class> 
</Player> 
-<Player> 
<Name>Shadow</Name> 
<Level>2</Level> 
<Class>Rogue</Class> 
</Player> 
-<Player> 
<Name>Crak</Name> 
<Level>3</Level> 
<Class>Wizard</Class> 
</Player> 
</Party>

次のようにして、これをNSMutableArrayに追加しようとしています。

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Party" ofType:@"xml"];
NSData *xmlData = [[NSMutableArray alloc] initWithContentsOfFile:filePAth];

これを実行すると、配列オブジェクトにデータが含まれていません。

行を次のように置き換えると、

NSdata *xmlData = [NSdata dataWithContentsOfFole:filePath];

データは読み込まれますが、必要な形式ではありません。

私はObjective-cとiPhoneの開発に非常に慣れていないので、どんな助けでも大歓迎です。これ以上の情報が必要な場合は、喜んで提供させていただきます。

編集-XMLを解析するためにGDataXMLを使用しています

編集-私のパーサークラスは次のとおりです

@implementation PartyParser

+(NSString *)dataFilePath:(BOOL)forSave{

    return [[NSBundle mainBundle] pathForResource:@"Party" ofType:@"xml"];
}

+(Party *)loadParty{

    NSString *filePath = [self dataFilePath:FALSE];
    //NSData *xmlData = [NSData dataWithContentsOfFile:filePath];
    NSData *xmlData = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
    if(doc ==nil){return nil;}

    NSLog(@"%@", doc.rootElement);

    Party *party = [[[Party alloc] init] autorelease];
    NSArray *partyMembers = [doc.rootElement elementsForName:@"Player"];
    for (GDataXMLElement *partyMember in partyMembers)
    {

        NSString *name;
        int level;
        RPGClass rpgClass;

        //Name
        NSArray *names = [partyMember elementsForName:@"name"];
        if(names.count > 0)
        {
            GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0];
            name = firstName.stringValue;
        }else continue;

        //Level
        NSArray *levels = [partyMember elementsForName:@"level"];
        if(levels.count > 0)
        {
            GDataXMLElement *firstLevel = (GDataXMLElement *) [levels objectAtIndex:0];
            level = firstLevel.stringValue.intValue;
        }else continue;

        //Class
        NSArray *classes = [partyMember elementsForName:@"class"];
        if(classes.count > 0)
        {
            GDataXMLElement *firstClass = (GDataXMLElement *) [classes objectAtIndex:0];
            if([firstClass.stringValue caseInsensitiveCompare:@"fighter"] == NSOrderedSame)
            {
                rpgClass = RPGClassFighter;
            }
            else if([firstClass.stringValue caseInsensitiveCompare:@"rogue"] == NSOrderedSame)
            {
                rpgClass = RPGClassRogue;
            }
            else if([firstClass.stringValue caseInsensitiveCompare:@"wizard"] == NSOrderedSame)
            {
                rpgClass = RPGClassWizard;
            }
            else
            {
                continue;
            }
        }else continue;

        Player *player = [[[Player alloc] initWithName:name level:level rpgClass:rpgClass] autorelease];
        [party.players addObject:player];
    }


    //NSLog(@"%@", doc.rootElement);
    //
    [doc release];
    [xmlData release];
    return party;
}

@end
4

3 に答える 3

1

XML ファイルは、どのタイプの XML であってもなりません。「プロパティリスト」形式である必要があります。

プロジェクトに含まれるいくつかの Apple ドキュメントまたは .plist ファイルを見てください。それはそのようなファイルを作成する方法を示します。

または、開発者ツールに付属の「PList エディター」アプリケーションを使用して作成します。これらのファイルを作成するための優れた UI があります。

最後に、「NSData* xmlData = ...」という行は非常に間違っています。変更可能な配列オブジェクトを NSData* 変数に割り当てています。タイプはロングショットで交換可能ではありません。

本格的な XML 解析を行いたい場合は、独自のトピックに値するさまざまなオプションがあります。plist に使用される XML は、Cocoa コレクションと単純なデータ型に限定されています。

于 2011-03-21T12:36:57.580 に答える
0

プロジェクト内の任意の場所に XML ファイル (例: "myFileName.xml") を配置するだけです。

以下を使用して、xml ファイルの内容を NSData に読み取ります。

NSString *myBundleString = [[NSBundle mainBundle] pathForResource:@"myFileName" ofType:@"xml"];
NSData *myData = [NSData dataWithContentsOfFile:myBundleString];

NSXMLParser を使用してデータを解析します。

NSXMLParser *myParser = [[NSXMLParser alloc] initWithData:myData];
[myParser setDelegate:self];
[myParser parse];

デリゲート メソッドを使用した解析をお楽しみください。

于 2012-08-04T22:43:52.013 に答える
0

この XML パーサーを見てください。それは「TBXML」と呼ばれています。私はそれをしばらく使用してきましたが、結果には非常に満足しています。

http://www.tbxml.co.uk/TBXML/TBXML_Free.html

于 2011-03-21T13:55:37.450 に答える