Представление объектных значений как строки

Изменение Значений Узлов обсуждает как, через setObjectValue: метод NSXMLNode, можно установить значение узла NSXML, чтобы быть объектом Objective C кроме NSString. Например, можно установить значение узла «даты», чтобы быть объектом NSCalendarDate, полученным из строкового значения такой как “10/31/04”. Со значением как объект можно легко выполнить вычисления, сравнения и другие операции, которые класс объекта делает возможным.

Когда Вы запрашиваете узел испустить свое значение путем отправки ему a stringValue или XMLString сообщение, это должно, конечно, представлять то значение как строку. Следующие разделы описывают строковые представления, предусмотрел стандартные атомарные типы данных, и объясните, как получить строковые представления для пользовательских объектов.

Стандартные строковые представления объектных значений

Классы NSXML обеспечивают канонические строковые представления для стандартного набора атомарных типов данных, каждый из которых представлен объектом Основы как объектное значение. Например, при хранении NSCalendarDate, поскольку объект узла оценивает и затем отправляет stringValue к тому узлу Вы возвращаете что-то вроде этого:

2004-06-23T14:31:04

Канонические строковые представления для простых и производных типов определяются в спецификации типов данных схемы XML W3C (http://www .w3.org/TR/xmlschema-2/). Таблица 1 перечисляет более важные типы, вместе с их связанным Фундаментальным классом и каноническим строковым представлением.

Таблица 1  Канонические строковые представления типов W3C

Класс

Тип W3C

Каноническое строковое представление

NSNumber

булевская переменная

NSNumber

десятичное число

Пример: 0.3 Не позволенный: другое продвижение или конечные нули, «+» знак

NSNumber

целое число

Примеры: -1, 0, 1267896

NSNumber

плавание

Примеры: -1E4, 1267.43233E12, 12, INF, NaN

NSNumber

дважды

Примеры: -1E4, 1267.43233E12, 12, INF, NaN

NSCalendarDate

dateTime

Формат: CCYY-MM-DDTгд:мм:ss [Z] Пример: 2004-10-31T20:15:34 Примечания: «T» является разовым датой разделителем; дополнительный «Z» указывает Всемирное координированное время.

NSData

base64Binary

Закодированное использование Кодирование Передачи Содержания Base64 (RFC 2045)

NSURL

URI (URL)

URI, как определено RFC 2396 и исправленный RFC 2732

Эти строковые представления следуют за канонической формой XML-схемы в результате проектного решения, не потому что классы NSXML смотрят на xsi:атрибут типа или выбор выходной формат на основе связанного типа элемента в схеме проверки.

Представления пользовательской строки объектных значений

Классы NSXML реализуют свои строковые представления для стандартных типов W3C через преобразователи значения — т.е. экземпляры пользовательских подклассов NSValueTransformer. Можно легко создать и зарегистрировать преобразователи значения для собственных объектов. Можно даже переопределить реализации стандартных преобразователей значения, реализованных классами NSXML.

Когда требуется представить объектное значение как строку, классы NSXML сканируют глобальный реестр преобразователей значения, ища имена преобразователя в следующем формате:

Например, если бы Ваш класс назвали «MyCustomClass», то надлежащее имя преобразователя было бы «NSXMLMyCustomClassTransformerName». Классы NSXML извлекают имя класса из имени преобразователя и используют его для идентификации объектного значения для преобразования.

Для полных подробных данных о создании пользовательского преобразователя значения см. Руководство по программированию Преобразователя Значения. Таким образом, необходимо переопределить методы класса NSValueTransformer transformedValueClass и allowsReverseTransformation и метод экземпляра transformedValue. Перечисление 1 показывает пример такой трансформации для пользовательского объекта с именем и переменной экземпляра даты.

Перечисление 1  Реализовывая преобразователь значения для объектного значения

@implementation NSXMLNameDateTransformer
 
+ (Class)transformedValueClass {
    return [NameDate class];
}
 
// transformation is oneway
+ (BOOL)allowsReverseTransformation {
    return NO;
}
 
- (id)transformedValue:(id)value {
    if ( [value isKindOfClass:[NameDate class]] ) {
        NSString *dateStr = [[value date]
            descriptionWithCalendarFormat:@"%Y-%m-%dT%H:%M:%S"];
        NSString *retVal = [NSString stringWithFormat:@"Name: %@ - Date: %@",
            [value name], dateStr];
        return retVal;
    }
    return @"";
}
@end

Ваше приложение должно зарегистрировать пользовательский преобразователь значения в классе NSValueTransformer как можно скорее. Хорошее место для регистрации находится в переопределении initialize метод класса. Для регистрации преобразователя значения отправьте a setValueTransformer:forName: обменивайтесь сообщениями к классу NSValueTransformer. Удостоверьтесь, что имя преобразователя соответствует требованию для преобразователей значения NSXML. См. Перечисление 2 для примера.

Перечисление 2  , Регистрирующее преобразователь значения

#import “NSXMLNameDateTransformer.h”
+ (void)initialize {
    NSValueTransformer *myTransformer = [[[NSXMLNameDateTransformer alloc]
        init] autorelease];
    [NSValueTransformer setValueTransformer:myTransformer
        forName:@"NSXMLNameDateTransformerName"];
}