Das normierte XML-Format dient dazu versions- und systemunabhängig Daten auszutauschen. Zu diesem Zweck werden die Daten so normiert, dass sich in der XML immer der gleiche 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>
Verarbeiten von normierten XML-Dateien
Die XML-Dateien enthalten in der Regel alle Informationen ausgehend von einem Repository oder einem Datensatz. Das kann eine mehrdimensionale Datenmatrix sein. Diese Informationen lassen sich wie folgt wieder in Entities überführen. Folgend 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); } }