Datentypen für mehrere Persönlichkeitsvorlagen
Ein MULTIPLE_PERSONALITY-Datentyp stellt einen Wert dar, der verschiedene Datentypen zu unterschiedlichen Zeiten enthalten kann. Dieser Datentyp ähnelt dem C-Sprachunion-Datentyp .
*DataType: MULTIPLE_PERSONALITY weist eine Vorlage an, einen Datentyp zu definieren, der Werte akzeptieren kann, die zu verschiedenen Datentypen gehören, ähnlich wie ein C-Sprachunion-Datentyp . Der MULTIPLE_PERSONALITY Datentyp versucht, die Identität (d. h. den Datentyp) des Werts zu bestimmen, und gibt denselben XML-Code aus, als ob der Wert explizit in der Vorlage definiert wurde, um zum identifizierten Datentyp zu gehören. Mit anderen Worten: Wenn ein MULTIPLE_PERSONALITY Datentyp definiert wurde, um eine Zeichenfolge oder ganze Zahl oder ein SYMBOL zu enthalten, und wenn der Wert tatsächlich eine ganze Zahl enthält, lautet die XML-Ausgabe die für einen ganzzahligen Datentyp.
Ein Personality-Tag-Attribut wird auch ausgegeben, um Clients bei der Ermittlung des Datentyps des ausgegebenen Werts zu unterstützen. Der Filter bestimmt den Datentyp des Werts, indem er den Wert mithilfe der einzelnen potenziellen Datentypen analysiert. Der Datentyp, der der größten Menge des Eingabewerts erfolgreich entspricht, wird ausgewählt. Im Falle einer Verknüpfung wird der Elementtyp ausgewählt, der zuerst in der Liste angezeigt wird.
Hinweis Sie können Wertsyntaxen erstellen, die diesen Auswertungsalgorithmus austricksen können. Seien Sie daher vorsichtig, wenn Sie die elementtypen auswählen, die aufgelistet werden sollen. Die Typen müssen durch den Analysealgorithmus ausreichend unterschieden werden können. Da der Parserfilter beispielsweise keine XML-Syntax erkennt, kann er nicht zwischen zwei XML_TYPE Datentypen unterscheiden. In diesen Fällen kann die Definition der Kandidatendatentypen jedoch eine *ArrayLabel-Direktive enthalten, die dem Parser hilft, zwischen ihnen zu unterscheiden.
Die folgenden Anweisungen werden verwendet, um den datentyp MULTIPLE_PERSONALITY zu definieren:
*ElementType (erforderlich). Eine Liste von Vorlagennamen, die die potenziellen Datentypen definiert, die dieser Wert annehmen könnte.
*ElementTags (erforderlich). Eine Liste von Tags, die dem Client helfen, den Datentyp zu identifizieren, der dem Wert tatsächlich zugewiesen ist. Die Anzahl der bereitgestellten Tags sollte der Anzahl von Vorlagen entsprechen, die in *ElementType aufgeführt sind. Das Tag wird in einem Personality-Attribut im generierten XML-Element angezeigt, das den Wert darstellt. Wenn der Datentyp beispielsweise ein Array mit mehreren Persönlichkeitsdatentypen ist, enthalten die Elemente, die die einzelnen Elemente des Arrays darstellen, das Personality-Attribut. Das Element, das das gesamte Array darstellt, enthält nicht das Personality-Attribut, da das Array selbst keine definierte Persönlichkeit aufweist. stattdessen verfügen die einzelnen Elemente des Arrays über einen eigenen wert für ein eigenes Persönlichkeitsattribut.
Betrachten Sie die folgende Vorlage.
*Template: INT_OR_QUALNAME_EX
{
*Type: DATATYPE
*DataType: MULTIPLE_PERSONALITY
*ElementType: (INTEGER, QUALNAME_EX, QUOTEDSTRING)
*ElementTags: (integer, QualNameEx, QuotedString)
}
Diese Vorlage definiert einen Datentyp, der einen INTEGER-Wert, QUALNAME_EX-Wert oder einen QUOTEDSTRING-Wert enthalten kann. Der ausgewählte Datentyp wird mit dem entsprechenden benutzerdefinierten ElementTag identifiziert.
Betrachten Sie die folgenden GDL-Einträge.
*rcNameID: ( RESDLL.stdname.467 )
*rcNameID: (0x117 )
Betrachten Sie die folgende RC_NAME_ID2-Vorlage.
*Template: RC_NAME_ID2
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: INT_OR_QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
Wenn die GDL-Einträge von der vorherigen Vorlage interpretiert werden, lautet die resultierende XML-Ausgabe wie folgt.
<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>
Der einzige Unterschied zwischen der XML-Ausgabe, die aus dem MULTIPLE_PERSONALITY-Typ generiert wird, und dem tatsächlichen Typ ist das zusätzliche Personality-Tag-Attribut, das hinzugefügt wird, um den Client über den tatsächlichen Datentyp des Werts zu informieren.
Sie können z. B. ein Array erstellen, bei dem jedes Element des Arrays ein MULTIPLE_PERSONALITY Typ ist, wie folgt.
*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
}
Außerdem können Sie die vorherige Vorlage verwenden, um die folgenden instance Daten zu verarbeiten. Dabei handelt es sich um ein Array, das drei mehrere Persönlichkeitsobjekte enthält, von denen jedes eine andere Persönlichkeit aufweist.
*rcNameID_List:( RESDLL.stdname.467, 0x117, "Quote" )
Diese Verarbeitung erzeugt den folgenden XML-Momentaufnahme.
<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>
Wie die Momentaufnahme zeigt, hat der Parser die richtige Persönlichkeit für jedes der drei Arrayelemente bestimmt und das Personality-Attribut im Element jedes Elements festgelegt, um die entsprechende Persönlichkeit anzugeben.