Joerg: xml-Dateien per php & DOMDocument zusammenführen

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

  1. 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

    1. 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?

      http://www.json.org/xml.html

      "When most programmers saw XML for the first time, they were shocked at how ugly and inefficient it was"

      mfg

      tami