xml-Dateien per php & DOMDocument zusammenführen
Joerg
- php
Hallo,
ich komme mit meinem Problem nicht so recht weiter. Ich habe eine "Stamm"-Datei, in welche viele kleine xml-Dateien eingefügt werden müssen.
Die Stamm-Datei ist wie folgt strukturiert (kommt nicht von mir, ist unveränderlich, ich arbeite mit einer Kopie):
<?xml version="1.0" encoding="UTF-8"?>
<!-- designs.xml -->
<designs>
<design type="fading">
<categories>
<category>Lifestyle</category>
</categories>
<fading file="DA213.svg" designElementId="46222"/>
</design>
<design type="fading">
<categories>
<category>Music</category>
</categories>
<fading file="M45AZ.svg" designElementId="51127"/>
</design>
<design type="fading">
<categories>
<category>Music</category>
</categories>
<fading file="CERIL3.svg" designElementId="35214"/>
</design>
</designs>
In diese "Stamm"-Datei sollen alle gefundenen "Unter"-Dateien - nach vorheriger Prüfung auf Vorhandensein (@designElementId) - eingefügt werden, die Struktur ist identisch:
<?xml version="1.0" encoding="UTF-8"?>
<!-- B21345.xml -->
<designs>
<design type="fading">
<categories>
<category>Lifestyle</category>
</categories>
<fading file="YX002.svg" designElementId="86241"/>
</design>
</designs>
Je "Unter"-Datei ist tatsächlich nur 1 design-Element vorhanden. Darüber hinaus muss in das Element "fading" noch ein Attribut eingefügt werden: default=0.
Jetzt habe ich mich im DOM-Gestrüpp in PHP verheddert und komme hier nicht mehr raus. Folgender Code funktioniert leider nicht, gibt aber eine Idee, in welche Richtung es gehen soll:
<?php
// Dateien benennen:
$dataxml = 'designs.xml'; // "Haupt"-Datei
$subfile = 'B21345.xml'; // 1 "Unter"-Datei
// Stamm-Daten einlesen:
$doc = new DOMDocument;
$doc->formatOutput = true;
$doc->load($dataxml, LIBXML_NOCDATA);
// Alle design-Elemente selektieren
$designs = $doc->getElementsByTagName('design');
// "Unter"-Datei einlesen
$subdoc = new DOMDocument;
$subdoc->load($subfile, LIBXML_NOCDATA);
// id ermitteln:
$xsubdoc = DOMXPath($subdoc);
$designID = $xsubdoc->query('//fading/@designElementId');
// id im Stamm schon vorhanden?
$xdoc = DOMXPath($designs);
found = (bool) $xdoc->query('//fading[@designElementId=' . $designID . ']');
/*
Wenn (not $found), dann gibt es die ID noch nicht in $doc,
der neue Node muss angehängt werden. In dem Fall muss im
Child 'fading' noch das Attribut 'default="0"' eingefügt werden.
*/
$dirty = false;
if (!$found) { // id noch nicht vorhanden, Element neu anhängen:
foreach($subdoc as $node) { // es gibt hier nur 1 Parent-Node
if ($node->nodeName == 'fading') {
if ($node->hasAttributes) {
$attr = DOMDocument::createAttribute('default');
$attr->value = '0';
$node->appendAttribute($attr);
}
}
$doc->appendChild($node);
$dirty = true;
break;
}
}
if ($dirty) $doc->save($dataxml); // Ergebnis speichern
?>
Ich hoffe, dass ich mich halbwegs verständlich machen konnte und würde mich über Lösungs-Hinweise sehr freuen.
Joerg
Hallo,
ich habs zwischenzeitlich mit ein paar Zeilen xsl gelöst ... Dieses libxml-Geraffel in PHP nervt eindeutig - wo bitteschön bleibt denn da die Leichtigkeit von xsl?
Schönes Wochenende,
Joerg
hi,
Hallo,
ich habs zwischenzeitlich mit ein paar Zeilen xsl gelöst ... Dieses libxml-Geraffel in PHP nervt eindeutig - wo bitteschön bleibt denn da die Leichtigkeit von xsl?
Wer sagt denn das?
"When most programmers saw XML for the first time, they were shocked at how ugly and inefficient it was"
mfg
tami