Представление объектных значений как строки
Изменение Значений Узлов обсуждает как, через 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 перечисляет более важные типы, вместе с их связанным Фундаментальным классом и каноническим строковым представлением.
Эти строковые представления следуют за канонической формой XML-схемы в результате проектного решения, не потому что классы NSXML смотрят на xsi:
атрибут типа или выбор выходной формат на основе связанного типа элемента в схеме проверки.
Представления пользовательской строки объектных значений
Классы NSXML реализуют свои строковые представления для стандартных типов W3C через преобразователи значения — т.е. экземпляры пользовательских подклассов NSValueTransformer. Можно легко создать и зарегистрировать преобразователи значения для собственных объектов. Можно даже переопределить реализации стандартных преобразователей значения, реализованных классами NSXML.
Когда требуется представить объектное значение как строку, классы NSXML сканируют глобальный реестр преобразователей значения, ища имена преобразователя в следующем формате:
NSXML
+ Имя класса +TransformerName
Например, если бы Ваш класс назвали «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"]; |
} |