【问题标题】:Creating NSMutableArray from xml file从 xml 文件创建 NSMutableArray
【发布时间】:2011-07-19 15:41:57
【问题描述】:

我有一个包含以下信息的 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

edit - 我的 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

【问题讨论】:

    标签: iphone objective-c xml nsmutablearray initwithcontentsoffile


    【解决方案1】:

    XML 文件不能是任何类型的 XML。它需要采用“属性列表”格式。

    查看一些 Apple 文档或将在您的项目中的一些 .plist 文件。这将向您展示如何创建这样的文件。

    或者,使用开发人员工具附带的“PList Editor”应用程序创建一个。它有一个很好的用户界面来创建这些文件。

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

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

    【讨论】:

    • 我正在使用 GDataXML 来解析我的 xml。并按照raywenderlich.com/725/… 的教程进行操作
    • 我也研究了 Plist,但不知道如何让它显示我的自定义类的数组。
    • Plists 不能包含自定义类。它们支持例如 NSString、NSDate、NSArray。您的课程需要 GDataXML。没有我所知道的快速简单的对象XML 持久性映射。
    • 我有 xml -> 目标代码,只是我似乎无法将 xml 保存到数组中。
    • 我认为您需要向我们展示一些代码!我不明白您所说的“保存到数组中”是什么意思。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,我以前看过那个。阻止我使用它的主要原因是它说你不能编辑或创建 xml 文件。
    【解决方案3】:

    只需将您的 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];
    

    使用委托方法进行愉快的解析!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多