core:index (Identifzieren eines Listeneintrags per Reihenfolgeposition)

Das Steuerungsattribut core:index kann verwendet werden, um in einem Import den zu aktualisierenden Eintrag einer Liste anhand seiner Listenposition zu identifizieren.

Der "Index" zählt dabei beginnend von 0 ganzzahlig aufwärts. Er wird unmittelbar vor jedem Zugriff komplett neu aufgebaut. Dies ist dann besonders wichtig, falls die adressierten Elemente nicht aktualisiert, sondern gelöscht werden sollen.

Häufig beinhaltet die Datenstruktur der Listeneintrags auch ein eigenes Index-Attribut, das z. B. bei typisierten pluralen Attributen auch index heißt.

Das Beispiel rechts zeigt einen XML- Ausschnitt vom attributes-Knoten eines Adressobjekts:

  • Die ersten zwei Attribute sind Werte eines pluralen Attributs vom Typ "Kommunikationsinformation", die über ein Attribut orderIndex verfügen , das die Reihenfolge der Listeneinträge angibt, die (wie hier zu sehen) nicht der Reihenfolge der Knoten im XML entsprechen muss.


  • Unterhalb folgen zwei Werte eines pluralen Textattributs vom Typ ACCESS_CODE, die das für Typisierte plurale Attibute generierte index -Attribut verwenden.


<attributes>
...
<base:AddressCommunicationInfo ... orderIndex="1" communicationType="EMAIL" communicationContext="manager">
<communicationValue>u1025@compa.ny</communicationValue>
</base:AddressCommunicationInfo>
<base:AddressCommunicationInfo ... orderIndex="0" communicationType="EMAIL" communicationContext="user">
<communicationValue>u4252@compa.ny</communicationValue> </base:AddressCommunicationInfo>
<base:AddressText ... >
<value textType="ACCESS_CODE" index="0">
<textValue>ABC123456789</textValue>
</value>
</base:AddressText>
<base:AddressText ... >
<value textType="ACCESS_CODE" index="1">
<textValue>XYZ987654321</textValue>
</value>
</base:AddressText>
... </attributes>

In beiden Fällen kann das jeweilige Indexattribut verwendet werden, um bei einen Import einen bestimmten Listeneintrag anhand seiner Position zu identifizieren.

Allerdings kann für denselben Zweck in beiden Fällen auch das core:index -Attribut für die Identifikation des Listeneintrags genutzt werden.

Beispiel 1: Aktualisieren eines bestimmten Eintrags in einem pluralen Attribut

Für ein Benutzerkonto liegen Adressdaten vor wie im einleitenden Beispiel gezeigt. Per Import soll eine bestimmte der aufgelisteten "Kommunikationsinformationen" aktualisiert werden, nämlich die mit orderIndex=1, die an der zweiten Position erscheint.

Vor dem Import:

images/download/attachments/201675351/image2020-7-23_18-14-10-version-1-modificationdate-1747137581144-api-v2.png

Der rechts abgebildete Import verwendet die Aktion UPDATE:

  • Das betreffende Benutzerkonto wird per ID (4252) eindeutig identifziert.


  • Die zu aktualisierende "Kommunikationsinformation" wird nur über die Listenpostion per core:index identifiziert.

Dem zweiten Eintrag wird eine neue E-Mail-Adresse zugewiesen.

<?xml version="1.0" encoding="UTF-8"?>
<core:Import ... action="UPDATE">
<base:User id="4252">
<address>
<attributes core:clear="false">
<base:AddressCommunicationInfo core:index="1">
<communicationValue>u2407@compa.ny</communicationValue>
</base:AddressCommunicationInfo>
</attributes>
</address>
</base:User>
</core:Import>

Nach dem Import: (Änderung durch Selektion hervorgehoben)

images/download/attachments/201675351/image2020-7-23_18-16-11-version-1-modificationdate-1747137581142-api-v2.png

Beispiel 2: Löschen der ersten beiden Einträge für ein Typisiertes plurales Attribut

Für ein Benutzerkonto liegen Adressdaten vor wie im einleitenden Beispiel gezeigt. Per Import sollen die (ersten) beiden Einträge für das plurale Textattribut ACCESS_CODE gelöscht werden.

Der rechts abgebildete Import verwendet die Aktion UPDATE:

  • Das betreffende Benutzerkonto wird per ID (4252) eindeutig identifziert.


  • Das Textattribut ACCESS_CODE wird zweimal nacheinander mit identischen Detaildaten adressiert. Das core:delete Attribut spezifiziert dabei das Löschen. Das core:index Attribut im Unterknoten value gibt an, welcher Eintrag gelöscht werden soll. Hier wird zweimal der Eintrag an der ersten Position gelöscht. Da die Liste bei jedem Zugriff erneut indiziert wird, rückt der zweite Eintrag nach dem Löschen des ersten nach.

HINWEIS◄ Das wiederholte Einfügen desselben Knotens in einer Importstruktur ermöglicht das Zuordnen einer Integer-Variable als "Pfad" für diesen Knoten, deren wahlweise statisch oder per Zuweisung zur Laufzeit des Profils bestimmter Wert die Anzahl der Iterationen definiert.

<?xml version="1.0" encoding="UTF-8"?>
<core:Import ... action="UPDATE">
<base:User id="4252">
<address>
<attributes>
<base:AddressText core:delete="true">
<value core:index="0" textType="ACCESS_CODE"></value>
</base:AddressText>
<base:AddressText core:delete="true">
<value core:index="0" textType="ACCESS_CODE"></value>
</base:AddressText>
</attributes>
</address>
</base:User>
</core:Import>

ANMERKUNG◄ Man könnte versuchen, im Import auf die beiden zu löschenden Einträge mit unterschiedlichen Werten für core:index (nämlich 0 und 1) zuzugreifen. Dann bliebe der zweite Eintrag bestehen und ein ggf. nachrückender dritter Eintrag würde ggf. gelöscht. Würden die Löschungen in umgekehrter Reihenfolge (erst 1 dann 0) ausgeführt, wäre das Löschen für beide Einträge erfolgreich.