In SOAP werden zwei Arten von zusammengesetzten Datentypen definiert, Structs und Arrays. In Structs ist der Elementname die einzige Möglichkeit zur Unterscheidung von Subelementen, wobei die Elementnamen einzigartig sein müssen. In Arrays werden die einzelnen Werte durch ihre ordinale Position identifiziert.
Die einzelnen Bestandteile eines zusammengesetzten Wertes werden durch einzelne Unterelemente repräsentiert, wobei jedes einzelne Subelement durch seinen Namen eindeutig identifiziert werden kann. Die dabei benutzen Elementnamen sind nur lokal sichtbar in Bezug auf den gesamten Struct, oder müssen voll qualifiziert angegeben werden.
Ein Struct, der ein Buch beschreibt, könnte etwa so aussehen:<e:Buch> <autor>David Flanagan</autor> <titel>Java In A Nutshell</titel> <verlag>O Reilly</verlag> <preis>69.00</preis> </e:Buch>Dieser Datenstruktur könnte das folgende XML-Schema-Fragment zugrunde liegen:
<element name="Buch"> <complexType> <element name="autor" type="xsd:string"/> <element name="titel" type="xsd:string"/> <element name="verlag" type="xsd:string"/> <element name="preis" type="xsd:float"/> </complexType>Natürlich können Structs ihrerseits auch wieder Structs enthalten.
Anstatt einen Wert direkt in ein Element einzufügen kann auch auf ein anderes Element verwiesen werden, in welchem dieser Wert zu finden ist. Dabei wird ein Wert durch die ihm zugewiesene ID vom Typ "ID" (nach der XML-Spezifikation) identifiziert. Jedes Element, dass auf ein anderes verweist, ist selbst leer und besitzt ein href-Attribut vom Typ "uri-reference" (nach der XML-Schema-Spezifikation). Solche Referenzen sind auch über mehrere Ebenen möglich:
<e:Buch> <autor href="#pDF"/> <titel>Java In A Nutshell</titel> </e:Buch> <e:Buch> <autor href="#pDF"/> <titel>JavaScript - Das umfassende Referenzwerk</titel> </e:Buch> <e:Person id="pDF"> <name>David Flanagan</name> <adresse href="#adrDF"/> </e:Person> <e:adresse id="adrDF"> <email>mailto:DavidF@hotmail.com</email> <www>http://www.davidf.com</www> </e:adresse>Diese Methode der Referenzierung verhindert das Bilden von redundanten Daten.
In SOAP werden Arrays durch die Werte ihrer Element repräsentiert, wobei der Elementname bei der Identifikation keine Rolle spielt. Da Arrays eine geordnete Sequenz von Elementen beinhalten, werden einzelne Elemente durch ihre Position im Array identifiziert. Ein Array kann alle möglichen Datentypen enthalten, auch weitere Arrays:
<primzahlen SOAP-ENC:arrayType="xsd:int[2]"> <zahl>3</zahl> <zahl>5</zahl> </primzahlen>Zu diesem Array würde das folgende Schema-Fragment passen:
<element name="primzahlen" type="SOAP-ENC:Array"/>Eine alternative Form, dieses Array abzubilden, wäre, zu jedem Element den im SOAP- ENC-Schema vordefinierten Datentyp zu benutzen. Dabei korrespondiert dann der Elementname mit dem Datentyp:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:int[2]"> <SOAP-ENC:int>3</SOAP-ENC:int> <SOAP-ENC:int>5</SOAP-ENC:int> </SOAP-ENC:Array>Mehrdimensionale Arrays werden wie in einigen Programmiersprachen als Strom von Elementen übermittelt:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[2,3]"> <item>Z1S1</item> <item>Z1S2</item> <item>Z1S3</item> <item>Z2S1</item> <item>Z2S2</item> <item>Z2S3</item> </SOAP-ENC:Array>
SOAP ermöglicht das teilweise Übertragen von Arrays. Dabei werden ab einem Offset, der durch das SOAP-ENC:offset-Attribut angegeben wird, beliebig viele Elemente übertragen. Der Offset wird notwendig, weil sonst davon ausgegangen wird, dass fehlende Elemente am Ende des Arrays liegen. Das folgende Beispiel enthält ein Array mit fünf Elementen, von denen aber nur die Elemente an den Positionen 3 und 4 übertragen werden:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[5]" SOAP-ENC:offset="[2]"> <item>Drei</item> <item>Vier</item> </SOAP-ENC:Array>
SOAP unterstützt auch das auszugsweise übertragen von dünn besetzten Arrays. Dabei wird für jedes zu übertragende Element die Position, an welcher es sich im Array befindet, durch das SOAP-ENC:position-Attribut angegeben. Im folgenden Beispiel handelt es sich um einen zweidimensionalen String-Array, in dem von den hundert möglichen Feldern nur zwei besetzt wurden:
<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[10][10]"> <item SOAP-ENC:position="[2,2]">3. Zeile, 3. Spalte</item> <item SOAP-ENC:position="[7,2]">8. Zeile, 3. Spalte</item> </SOAP-ENC:Array>