lixx: ID-Mapping mit XML

Beitrag lesen

Hallo liebe Leut’!

Bitte helft mir. Ich bin schier am verzweifeln!

Ich versuche eine language-Klasse in PHP (5.0.x) zu basteln, die XML-Dateien ausliest und in einer Variable speichert. Mein Problem liegt nun darin, dass sich die einzelnen Nodes nicht per getElementById() der DOM Function ansprechen lassen. Nach langem Suchen bin ich auf diese Seite http://php5.bitflux.org/xmlonspeed/slide_24.php gestoßen und möchte daher auf jeden Fall diese Methode benutzen.

Nun ist es so, dass man, um diese Methode nutzen zu können, bei der DOM Function eine ID deklarieren muss. (Auch schon gefunden ;) http://wiki.flux-cms.org/display/BLOG/GetElementById+Pitfalls). Ich habe mich dabei für "xml:id" entschieden.

Hier einmal kurz die Dateien...

de.lang.xml:
-------------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<xml>
 <locale lang="de">
  <str xml:id="myID1">aaa</str>
  <str xml:id="myID2">bbb</str>
 </locale>
</xml>
-------------------------------------------

index.php:
-------------------------------------------
// Lade Sprachdatei
$lf = new DOMDocument('1.0', 'UTF-8');
$lf->preserveWhiteSpace = false;
$lf->load('de.lang.xml');

// Erstelle neues XML-Dokument
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->preserveWhiteSpace = false;
$xml->appendChild(new DOMElement('xml'));

// Führe Sprach-Nodes mit neuem XML-Dokument zusammen.
// Das ist auf jeden Fall notwendig, da mehrere Sprachdateien
// nacheinander zu laden sein sollen.
$xml->documentElement->appendChild(
 $xml->importNode($lf->documentElement->firstChild, true));

echo $xml->getElementById('myID2')->nodeValue . "\n";

$x = $xml->saveXML();

header('Content-Type: application/xml; charset=UTF-8');
header('Content-Length: '.strlen($x));

print($x);

exit;
-------------------------------------------

Jetzt passiert folgendes: Beim Aufruf von echo $xml->getElementById('myID2')->nodeValue passiert nix. Er findet diese ID nicht. Wenn ich nun aber $lf->getElementById('myID2')->nodeValue verwende, also die Spach-Datei direkt, dann klappt es.

$xml->saveXML() gibt mir aber den vollständigen und richtigen Baum mit xml:id wieder.

Warum funktioniert das nicht oder wie kann man das sonst noch lösen? Was ich auf jeden Fall benötige ist das mergen von mehreren XML-Dateien und Schleifen wie ...

for ($i=0; $i<$xml->childNodes->length; $i++)
{
 $cn = self::$XML->importNode($xml->childNodes->item($i), true);
 $xml_data->appendChild($cn);
}

... möchte ich auch vermeiden.

Danke euch im Voraus!

lg lixx