Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Тип данных MULTIPLE_PERSONALITY представляет значение, которое может хранить различные типы данных в разное время. Этот тип данных аналогичен типу данных union языка C.
*DataType: MULTIPLE_PERSONALITY направляет шаблон для определения типа данных, который может принимать значения, принадлежащие нескольким разным типам данных, так же как тип данных union языка C. Тип данных MULTIPLE_PERSONALITY пытается определить идентичность (т. е. тип данных) значения и выдаст тот же XML-код, как если бы значение было явно определено в шаблоне как принадлежащее определяемому типу данных. Другими словами, если для хранения строки или целого числа или СИМВОЛа определен тип данных MULTIPLE_PERSONALITY, а если значение фактически содержит целое число, выходные данные XML будут иметь значение для целочисленного типа данных.
Атрибут идентификационного тега также создается, чтобы помочь клиентам определить тип данных значения, которое было выдано. Фильтр определяет тип данных значения путем анализа значения с помощью каждого потенциального типа данных. Выбран тип данных, который успешно соответствует наибольшему количеству входного значения. В случае ничьей будет выбран тот тип элемента, который первым отображается в списке.
Заметка Вы можете создавать синтаксисы значений, которые могут обмануть этот алгоритм оценки, поэтому будьте внимательны при выборе типов элементов для включения в список. Типы должны быть достаточно различимы алгоритмом синтаксического анализа. Например, так как фильтр синтаксического анализа не распознает синтаксис XML, он не может различать два типа данных XML_TYPE. Однако в этих случаях определение типов данных-кандидатов может включать директиву *ArrayLabel, которая поможет синтаксическому анализу различать их.
Для определения типа данных MULTIPLE_PERSONALITY используются следующие директивы:
*ElementType (обязательный). Список имен шаблонов, определяющих потенциальные типы данных, которые могут предполагать это значение.
*ElementTags (обязательный). Список тегов, помогающих клиенту определить тип данных, который фактически назначается значению. Число предоставленных тегов должно совпадать с количеством шаблонов, перечисленных в *ElementType. Тег появится в атрибуте личности в созданном XML-элементе, представляющего значение. Например, если тип данных является массивом нескольких типов данных личности, элементы, представляющие отдельные члены массива, будут содержать атрибут личности. Элемент, представляющий весь массив, не будет содержать атрибут личности, так как сам массив не имеет определенной личности; Вместо этого отдельные члены массива имеют собственное значение атрибута личности.
Рассмотрим следующий шаблон.
*Template: INT_OR_QUALNAME_EX
{
*Type: DATATYPE
*DataType: MULTIPLE_PERSONALITY
*ElementType: (INTEGER, QUALNAME_EX, QUOTEDSTRING)
*ElementTags: (integer, QualNameEx, QuotedString)
}
Этот шаблон определяет тип данных, который может содержать значение INTEGER, QUALNAME_EX значение или значение QUOTEDSTRING. Независимо от выбранного типа данных он будет обозначен соответствующим пользователем определяемым ElementTag.
Рассмотрим следующие записи GDL.
*rcNameID: ( RESDLL.stdname.467 )
*rcNameID: (0x117 )
И рассмотрим следующий шаблон RC_NAME_ID2.
*Template: RC_NAME_ID2
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: INT_OR_QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
Если записи GDL интерпретируются предыдущим шаблоном, результат выходных данных XML будет следующим образом.
<GDL_ATTRIBUTE Name="*rcNameID" Personality="QualNameEx" >
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</GDL_ATTRIBUTE>
<GDL_ATTRIBUTE Name="*rcNameID" Personality="integer"
xsi:type="GDLW_int" >279</GDL_ATTRIBUTE>
Единственное различие между выходными данными XML, созданными из типа MULTIPLE_PERSONALITY, и фактическим типом является дополнительный атрибут тега личности, добавляемый для информирования клиента о фактическом типе данных значения.
Например, можно создать массив, в котором каждый элемент массива является MULTIPLE_PERSONALITY типом, как показано ниже.
*Template: DT_ARRAY_OF_MP
{
*Type: DATATYPE
*DataType: ARRAY
*ElementType: INT_OR_QUALNAME_EX
*RequiredDelimiter: ","
*OptionalDelimiter: "<20 09>"
*ElementTags: (ArrayMember)
*ArraySize: *
}
*Template: ARRAY_OF_MP
{
*Name: "*rcNameID_List"
*Type: ATTRIBUTE
*ValueType: DT_ARRAY_OF_MP
}
И вы можете использовать предыдущий шаблон для обработки следующих данных экземпляра, который представляет собой массив, содержащий три нескольких объектов личности, каждый из которых имеет другую личность.
*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )
Эта обработка создаст следующий XML-снимок.
<GDL_ATTRIBUTE Name="*rcNameID_List" >
<ArrayMember Personality="QualNameEx">
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</ArrayMember>
<ArrayMember Personality="integer" xsi:type="GDLW_int">279</ArrayMember>
<ArrayMember Personality="QuotedString" xsi:type="GDLW_string">Quote</ArrayMember>
</GDL_ATTRIBUTE>
Как показано на снимке, средство синтаксического анализа определило правильный тип личности для каждого из трех элементов массива и задало атрибут личности в элемент каждого члена, чтобы указать соответствующий тип личности.