Normierte XML

Das normierte XML-Format dient dazu, Daten versions- und systemunabhängig auszutauschen. Zu diesem Zweck werden die Daten so normiert, dass sich in der XML-Datei immer derselbe Aufbau findet. Es entsteht eine Struktur, die Repositories, Entities, Columns und Translations zusammenfasst.    

<?xml version="1.0"?> <root> <repositories> <repository name="table1"> <entity reference="ref-123"> <column name="title" primaryKey="true">Dieser Title darf nur einmal vorkommen</column> <column name="content">Dies ist ein Text</column> </entity> </repository> <repository name="table2"> <entity reference="ref-234"> <column name="title">Dieser Datensatz wird immer neu angelegt</column> <column name="content">Dies ist ein Text</column> </entity> </repository> </repositories> </root>

Verwendung von Attributen

/entity[delete=true]

Mit delete kann festgelegt werden, dass das Entity nicht gespeichert, sondern gelöscht werden soll.

/entity[noSave=true]

Mit noSave kann festgelegt werden, dass das Entity nicht gespeichert werden soll. Diese Einstellung kann notwendig sein, wenn das Entity dennoch benötigt wird, um beispielsweise eine Verknüpfung damit zu erzeugen.

/entity/column[primaryKey=true]

Mit primaryKey kann definiert werden, dass anhand dieser Spalte der Datensatz in der Datenbank identifiziert werden soll. Dies ermöglicht die Unterscheidung, ob ein Update oder ein Insert durchgeführt werden muss.

/entity/column[noCast=true]

Mit noCast kann festgelegt werden, dass der Wert nicht gecastet werden soll. Der Wert liegt bereits in der Form vor, die eins zu eins in die Datenbank übernommen werden soll.

Verarbeiten von normierten XML-Dateien

Die XML-Dateien enthalten in der Regel alle Informationen, die von einem Repository oder einem Datensatz ausgehen. Das kann eine mehrdimensionale Datenmatrix sein. Diese Informationen lassen sich wie folgt wieder in Entities überführen. Im Folgenden ein Code-Beispiel:

use Brandbox\FrameworkEtl\Etl\ShareFile; use Brandbox\Framework\Brandbox\Log; $logger = new Log\PsrLogger(); $statefulImporter = $this ->staticController(ShareFile\ShareManager::class) ->getStatefulImporter('path/normalized.xml', $logger) ; $run = $statefulImporter->run(); $dataPersistor = $statefulImporter->getDataPersistor(); $objects = $dataPersistor->getObjects(); $entities = []; // Create entities and collect references foreach ($objects as $repository => $importObjects) { foreach ($importObjects as $importObjectKey => $importObject) { $id = (int)$importObject->getValues()['id']; /* @var ShareFile\Lib\Interfaces\PrimaryImportObjectInterface $importObject */ $entity = $this ->newInstance($repository) ->setID($id) ->detach() ; $dataPersistor ->getInventory() ->addReferences($importObject->getReferences(), $entity) ; $entities[$repository][$importObjectKey] = $entity; } } // Map values to entities foreach ($objects as $repository => $importObjects) { foreach ($importObjects as $importObjectKey => $importObject) { $entity = $entities[$repository][$importObjectKey]; $fields = $dataPersistor ->getFieldConverter() ->getImportFields($importObject->getRepository()) ; $dataPersistor->mapValuesInEntity($importObject, $entity, $fields); } } var_dump($entities);