Создание NSMutableArray из файла XML - PullRequest
0 голосов
/ 21 марта 2011

У меня есть 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, и любая помощь будет принята с благодарностью. Если потребуется дополнительная информация, я с радостью ее предоставлю.

edit - я использую 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

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Файл XML не может быть XML любого типа. Он должен быть в формате «список свойств».

Взгляните на некоторые документы Apple или некоторые файлы .plist, которые будут в вашем проекте. Это покажет вам, как создать такой файл.

Кроме того, можно создать приложение с помощью приложения «Редактор списков», которое поставляется с инструментами разработчика. Он имеет хороший интерфейс для создания этих файлов.

Наконец, ваша строка "NSData * xmlData = ..." очень неправильная - вы присваиваете объект изменяемого массива переменной NSData *. Типы не являются взаимозаменяемыми при длинном выстреле.

Если вы хотите выполнить полноценный синтаксический анализ XML, существуют различные варианты, которые заслуживают отдельной темы. XML, используемый для списков, ограничен коллекциями Какао и простыми типами данных.

0 голосов
/ 05 августа 2012

Просто поместите ваш 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];

Удачного анализа с использованием методов делегата!

0 голосов
/ 21 марта 2011

Посмотрите на этот XML-парсер.Это называется "TBXML", я использовал это некоторое время, и я вполне доволен результатом.

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

...