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 开发非常陌生,任何帮助都将不胜感激。如果需要更多信息,我很乐意提供。

编辑 - 我正在使用 GDataXML 解析我的 xml

编辑 - 我的 Parser 类如下

@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 Editor”应用程序创建一个。它具有用于创建这些文件的良好 UI。

最后,您的“NSData* xmlData = ...”行是非常错误的 - 您将可变数组对象分配给 NSData* 变量。从长远来看,这些类型不能互换。

如果您想要进行全面的 XML 解析,有各种选项值得单独讨论。用于 plist 的 XML 仅限于 Cocoa 集合和简单数据类型。

于 2011-03-21T12:36:57.580 回答
0

看看这个 XML Parser。它被称为“TBXML”,我已经使用了一段时间,我对结果非常满意。

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

于 2011-03-21T13:55:37.450 回答
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 回答