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)
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>';
?>