Zwei XML-Dateien zusammenführen

Frage:

Folgende XML-Dateien sind gegeben:

Datei 1
<root>
<wert gleichesattribute="schluessel_x" attribute_3="wert_x3" attribute_4="wert_x4"/>
<wert gleichesattribute="schluessel_y" attribute_3="wert_y3" attribute_4="wert_y4"/>
<wert gleichesattribute="schluessel_z" attribute_3="wert_z3" attribute_4="wert_z4"/>
</root>
Datei 2
<root>
<wert gleichesattribute="schluessel_x" attribute_1="wert_x1" attribute_2="wert_x2"/>
<wert gleichesattribute="schluessel_y" attribute_1="wert_y1" attribute_2="wert_y2"/>
</root>

Diese Dateien sollen zusammengeführt werden zu:

<root>
<wert gleichesattribute="schluessel_x" attribute_1="wert_x1" attribute_2="wert_x2" attribute_3="wert_x3" attribute_4="wert_x4"/>
...
</root>
(aus dem SelfHTML Forum)
Lösung:

Folgendes PHP Script leistet das gewnschte:

<?php

// Die beiden XML-Dateien einlesen
$xml1 = simplexml_load_file("1.xml");
$xml2 = simplexml_load_file("2.xml");

// Element-Baum initialisieren
$data = array();

// Erste Datei durchgehen
foreach($xml1->wert as $wert) {
  // und jedes Element anhand seiner ID (gleiches Attribut)
  // in den Element-Baum einhängen
  $id = (string) $wert['gleichesattribute'];
  $data[$id] = array();
  // Alle Attribute in den Element-Baum übernehmen
  foreach($wert->attributes() as $name => $value) {
    // mit Ausnahme der ID, die ja bereits als Key existiert
    if($name == "gleichesattribute") continue;
    $data[$id][$name] = (string) $value;
  }
}

// Zweite Datei durchgehen
foreach($xml2->wert as $wert) {
  // und jedes Element anhand seiner ID (gleiches Attribut)
  // in den Element-Baum einhängen, sofern noch nicht vorhanden
  $id = (string) $wert['gleichesattribute'];
  if(!isset($data[$id])) {
    $data[$id] = array();
  }
  // Alle Attribute in den Element-Baum übernehmen
  foreach($wert->attributes() as $name => $value) {
    // mit Ausnahme der ID, die ja bereits als Key existiert
    if($name == "gleichesattribute") continue;
    $data[$id][$name] = (string) $value;
  }
}

// Header für XML-Ausgabe senden
header("Content-type: application/xml");

// XML-Ausgabe generieren
echo '<root>';
// Für jedes Element im Element-Baum
foreach($data as $id => $record) {
  // Den XML-Tag...
  echo '<wert gleichesattribute="' . $id . '" ';
  // ... mit allen Attributen generieren
  foreach($record as $name => $value) {
    echo $name . '="' . $value . '" ';
  }
  echo '/>';
}
echo '</root>';

?>

© 2006, Dennis Riehle.