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