Типы данных и XMLParser - PullRequest
       1

Типы данных и XMLParser

0 голосов
/ 23 июля 2010

Я синхронизирую данные на своем веб-сайте с моим приложением, для этого я использую NSXMLParser. Проблема в том, что все поля в моей базе данных определены как строки. Процесс синхронизации работает нормально, когда все является строкой, но это вызывает у меня душевную боль, когда я пытаюсь использовать эти данные для других целей.

Может ли кто-нибудь помочь мне с определением полей с правильными типами данных для процесса синхронизации, код ниже:

.m

// Array for WORKOUT.
    NSMutableString *currentID, *currentUserID, *currentWalkID, *currentDate, *currentDistance, *currentRepeats, *currentType, *currentIntensity,
    *currentComments, *currentTime, *currentWeight, *currentHeight;

Я знаю, что это как-то связано с этой NSMutableString, очевидно, все определяется как строка.

.h

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{           
    currentElement = [elementName copy];

    // Check for the WORKOUT details in the XML feed.
    if ([elementName isEqualToString:@"workout"]) 
    {
        // clear out our workout item caches...
        item = [[NSMutableDictionary alloc] init];
        currentID = [[NSMutableString alloc] init];
        currentUserID = [[NSMutableString alloc] init];
        currentWalkID = [[NSMutableString alloc] init];
        currentDate = [[NSMutableString alloc] init];
        currentDistance = [[NSMutableString alloc] init];
        currentRepeats = [[NSMutableString alloc] init];
        currentType = [[NSMutableString alloc] init];
        currentIntensity = [[NSMutableString alloc] init];
        currentComments = [[NSMutableString alloc] init];
        currentTime = [[NSMutableString alloc] init];
        currentWeight = [[NSMutableString alloc] init];
        currentHeight = [[NSMutableString alloc] init];
    }
}   


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{     
    if ([elementName isEqualToString:@"workout"]) 
    {
        Workout *newWorkout = [NSEntityDescription insertNewObjectForEntityForName:@"Workout" inManagedObjectContext: self.managedObjectContext];

        // save values to an item, then store that item into the array...
        [item setObject:currentID forKey:@"workout_id"];
        [item setObject:currentUserID forKey:@"workout_user_id"];
        [item setObject:currentWalkID forKey:@"workout_walk_id"];
        [item setObject:currentDate forKey:@"workout_date"];
        [item setObject:currentDistance forKey:@"workout_distance"];
        [item setObject:currentRepeats forKey:@"workout_repeats"];
        [item setObject:currentType forKey:@"workout_type"];
        [item setObject:currentIntensity forKey:@"workout_intensity"];
        [item setObject:currentComments forKey:@"workout_comments"];
        [item setObject:currentTime forKey:@"workout_time"];
        [item setObject:currentWeight forKey:@"workout_weight"];
        [item setObject:currentHeight forKey:@"workout_height"];

        newWorkout.workout_id = currentID;
        newWorkout.workout_user_id = currentUserID;
        newWorkout.workout_walk_id = currentWalkID;
        newWorkout.workout_date = currentDate;
        newWorkout.workout_distance = currentDistance;
        newWorkout.workout_repeats = currentRepeats;
        newWorkout.workout_type = currentType;
        newWorkout.workout_intensity = currentIntensity;
        newWorkout.workout_comments = currentComments;
        newWorkout.workout_time = currentTime;
        newWorkout.workout_weight = currentWeight;
        newWorkout.workout_height = currentHeight;
        [self.workoutArray addObject:newWorkout];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    // save the characters for the current item...
    if ([currentElement isEqualToString:@"workout_id"]) {
        [currentID appendString:string];
    } else if ([currentElement isEqualToString:@"workout_user_id"]) {
        [currentUserID appendString:string];
    } else if ([currentElement isEqualToString:@"workout_walk_id"]) {
        [currentWalkID appendString:string];
    } else if ([currentElement isEqualToString:@"workout_date"]) {
        [currentDate appendString:string];
    } else if ([currentElement isEqualToString:@"workout_distance"]) {
        [currentDistance appendString:string];
    } else if ([currentElement isEqualToString:@"workout_repeats"]) {
        [currentRepeats appendString:string];
    } else if ([currentElement isEqualToString:@"workout_type"]) {
        [currentType appendString:string];
    } else if ([currentElement isEqualToString:@"workout_intensity"]) {
        [currentIntensity appendString:string];
    } else if ([currentElement isEqualToString:@"workout_comments"]) {
        [currentComments appendString:string];
    } else if ([currentElement isEqualToString:@"workout_time"]) {
        [currentTime appendString:string];
    } else if ([currentElement isEqualToString:@"workout_weight"]) {
        [currentWeight appendString:string];
    } else if ([currentElement isEqualToString:@"workout_height"]) {
        [currentHeight appendString:string];
} 

1 Ответ

0 голосов
/ 23 июля 2010

XML может содержать только строки. Если это внутренний текст элемента или значение атрибута, в конце концов, все это просто строка.

Если вы хотите отправить что-либо другое через XML, отправляющая сторона должна закодировать его в строку, а принимающая сторона должна декодировать строку. Чтобы это работало, обе стороны должны согласовать формат, например, для значения типа Integer одна возможность состоит в том, чтобы кодировать 125 как «125», или число с плавающей запятой 2.5 как «2.5». Если вы используете этот формат для своих чисел, вы можете декодировать их, используя integerValue и floatValue NSString.

float test = [@"2.5" floatValue];

Существует несколько стандартных форматов, определенных в xsd , которые вы можете использовать, но это не поможет вам их декодировать, если у вас нет парсера, который делает это за вас. (NSXMLParser не такой) Если вы используете другие форматы, посмотрите на NSScanner. Для дат и времени вы хотели бы посмотреть на NSDateFormatter.

Если вам нужна помощь в конвертации, пожалуйста, опубликуйте формат, который вы используете, это отрывок из вашего XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...