Hi Carsten.Sch.,
Ich habe aber immer noch das Problem, dass ich nicht weiß wie ich eine neue XML-Datei anlege.
Erstmal solltest du dich entscheiden, welche PHP-Erweiterung du nutzen willst. SimpleXML wäre die eine, DOM die andere Möglichkeit.
SimpleXML bietet vor allem eine sehr einfache Handhabung - so werden die XML-Elemente durch Objekte repräsentiert, mit welchen du (dank SPL) so arbeiten kannst, wie du es mit der Arbeit von normalen Variablen und Arrays in PHP gewöhnt bist.
DOM hingegen ist mag von der Verwendung her etwas komplizierter sein, allerdings kannst du hier gezielter mit den XML-Elementen arbeiten, Elemente hinzufügen, CDATA-Inhalte einfügen oder Dokumente anhand ihrer DTD oder anhand ihres Schemas validieren. DOM ist halt einfach nicht so schön „simple” zu verwenden, kann aber dafür in manchen Gebieten vielleicht etwas mehr ;-)
Für den Anfang (und für das bloße Auslesen von XML-Dateien auf jeden Fall) würde ich dir also zu SimpleXML raten.
Bei einer Datenbank habe ich eine Tabelle in die ich schreiben kann,
aber wie mache ich das bei einer XML-Datei?
Du erstellst eine Datei, liest den Inhalt ein, verarbeitest diesen und speicherst ihn anschließend wieder in die Datei zurück. Etwas anderes macht eine Datenbank ja auch nicht, nur dass du davon nichts mitbekommst, weil du von außen nur deine SQL-Befehle absetzt. (Abgesehen davon speichert eine Datenbank ihre Daten natürlich nicht in XML, sondern in irgendeinem anderen, performanteren Format ab.)
Auf die Frage ob ich dafür erst einmal eine leere XML-Datei brauch,
also nur die Elemente (<element><titel></titel></element>) mein frankx "ja, das geht.".
Heißt das, dass es so gemacht wird oder so auch funktioniert?
Was ist die gängige Methode?
Schau doch einfach mal in das PHP-Handbuch für die Erweiterung SimpleXML. Dort siehst du die Funktionen simplexml_load_file() und simplexml_load_string() - hm, das scheint wohl beides ein existierendes XML-Dokument vorauszusetzen. Also noch einen Blick in den Konstruktur von SimpleXMLElement werfen, aber auch hier wird für den Parameter $data von einem validen XML-Dokument gesprochen.
Also musst du dir erst mal selber ein leeres Dokument erstellen:
$data = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'
. '<mydata></mydata>';
// ein SimpleXML Objekt erstellen
$sxe = new SimpleXMLElement($data);
// alternativ so, das Resultat ist dasselbe
#$sxe = simplexml_load_string($data);
// auch das Laden einer Datei wäre möglich
#$sxe = simplexml_load_file('pfad/zur/datei.xml');
// Kontrollausgabe, so sieht es aus:
echo $sxe->asXML();
Wenn ich erstmal eine Datei angelegt bekommen habe, will ich anfangen damit zu Experimentieren.
Zum Beispiel so:
$sxe->addChild('uhrzeit', '15:34');
$sxe->addChild('container');
$sxe->container->addChild('abd', 'Ein paar Daten');
$sxe->container->addChild('def', 'Noch ein paar Daten');
echo $sxe->asXML();
Die Ausgabe sieht so aus (die Zeilenumbrüche hab ich zur besseren Lesbarkeit eingefügt, die stammen nicht von SimpleXML):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<mydata>
<uhrzeit>15:34</uhrzeit>
<container>
<abd>Ein paar Daten</abd>
<def>Noch ein paar Daten</def>
</container>
</mydata>
Und bevor ichs vergesse frage ich lieber nochmal nach:
Muss ich die XML-Datei wegen Race-Condition noch gesondert behandeln oder übernehmen das die SimpleXML-Funktionen die mir Jeena Paradies verlinkt hat?
Die Funktionen kümmern sich um gar nichts. Lediglich simplexml_load_file() öffnet eine Datei, liest den Inhalt ein und schließt die Datei wieder. Alle anderen SimpleXML-Funktionen arbeiten nicht mit irgendwelchen Dateien! (DOM übrigens auch nicht.) Du musst dich selber darum kümmern, dass das manipulierte XML-Dokument wieder zurück in eine Datei gespeichert wird, andernfalls gehen die Informationen zum Scriptende (wie alle Variablen) verloren.
Hierbei wirst du über kurz oder lang natürlich auf das ein oder andere Problem stoßen - was, wenn ein Benutzer eine Seite aufruft, um einen bestimmten Datensatz aus der XML-Datei zu bearbeiten und ein anderen Benutzer genau diesen Datensatz löscht, bevor der erste User dazu kommt, seine Änderungen zu speichern? Zu dem Thema kannst du dir dann selber mal ein paar Gedanken machen ;-)
Viele Grüße,
~ Dennis.