XML oder CSV
Carsten.Sch.
- php
Guten Abend liebes Forum!
Ich möchte Benutzerdaten (Name, Mail, Passwort usw.) in einer Datei auf dem Server speichern.
Ich dachte dabei an eine bequeme XML-Datei, aus der ich dann wie aus einer Datenbank die gewünschten Datensätze einfach in ein Array einlesen kann.
Ähnlich geht es auch mit einer CSV-Datei oder?
Ich habe mit beiden Formaten aber noch nicht gearbeitet.
Gibt es also irgendwo eine gute Einleitung wie ich mit PHP eine XML-Datei schreibe und auslese?
Wie geh ich da vor? Das ist doch DOM oder?
Also würde ja sowas wie
<user>
<name>Hans</name>
<mail>hans@domain.tld</mail>
</user>
<user>
<name>Klaus</name>
<mail>klaus@domain.tld</mail>
</user>
funktionieren. Nur wie les ich das aus? Mit RegExp?
Und wie sähe eine Insertfunktion für sowas aus?
Ich hoffe ich hab mich verständlich ausgedrückt.
Bin für alle Vorschläge und weiterführende Links offen.
Schönen Sonntag noch!
Carsten
Hallo,
Guck dir mal simplexml an: http://php.net/simplexml
Jeena
Hallo Jeena!
Guck dir mal simplexml an: http://php.net/simplexml
heißt dass, das ich zunächst einmal eine "leere" XML-Datei anlegen muss bevor ich diese dann wie ein Array behandeln kann?
Danke dir!
Carsten
Hellihello
Guck dir mal simplexml an: http://php.net/simplexml
heißt dass, das ich zunächst einmal eine "leere" XML-Datei anlegen muss bevor ich diese dann wie ein Array behandeln kann?
ja, das geht.
Dank und Gruß,
@@Carsten.Sch.:
Nur wie les ich das aus? Mit RegExp?
Nein.
Mit XSLT?
Live long and prosper,
Gunnar
Hallo,
Nur wie les ich das aus? Mit RegExp?
Nein.
Mit XSLT?
danke das hatte ich auch noch nicht gelesen, aber mir ging es eigentlich eher darum wie ich die Elemente einer XML-Datei in ein Array krieg.
Der Link von Jeena hat mir da schon ein bisschen weiter geholfen.
Ich habe aber noch ein paar weitere Gedankengänge.
Bei einer Tabelle kann ich einfach eine weitere Spalte hinzufügen,
wie geht das bei einer XML-Datei? Muss ich dort jedem Element einen Wert hinzufügen? Ähnlich update oder delete. Und wie verhält es sich mit Race Condition? Oder handelt das PHP von selbst mit den SimpleXML-Funktionen?
Ui ui, ganz schön viel zu lesen. Das ganze ist wohl doch nicht so einfach, dass ich es an einem Tag verstehen könnte oder?
Ich danke euch für eure Hilfe!
Carsten
Hallo Gunnar!
Mit XSLT?
danke das hatte ich auch noch nicht gelesen, aber mir ging es eigentlich eher darum wie ich die Elemente einer XML-Datei in ein Array krieg.
Entschuldigung, da hab ich mich glaube ungeschickt ausgedrückt.
Also ich möchte zum Beispiel ein Login-Formular schreiben, und die Daten mit denen in der XML-Datei vergleichen bzw. auch neue Nutzer hinzufügen/ändern können.
Ein Großteil dieser Fragen wurden durch den Link von Jeena Paradies beantwortet.
Danke!
Carsten
Also ich möchte zum Beispiel ein Login-Formular schreiben, und die Daten mit denen in der XML-Datei vergleichen bzw. auch neue Nutzer hinzufügen/ändern können.
Ich hoffe du meinst das nicht wirklich ernst und das Projekt existiert nur intern.
Guten Morgen!
Also ich möchte zum Beispiel ein Login-Formular schreiben, und die Daten mit denen in der XML-Datei vergleichen bzw. auch neue Nutzer hinzufügen/ändern können.
Ich hoffe du meinst das nicht wirklich ernst und das Projekt existiert nur intern.
Jein. Ich interessiere mich für den Umgang mit XML-Dateien und hatte keine Aufgabe dafür, also dachte ich, ich leg mir ein paar Benutzer an, bearbeite sie, lösch sie wieder etc. Das Script selbst dient mir also nur zu Studienzwecken, XML-Dateien will ich auch später weiter verwenden.
Aber wieso soll ich es eigentlich nur intern verwenden?
Was ist daran so falsch?
Danke!
Carsten
Hi Carsten.Sch.,
Was ist daran so falsch?
Meines Erachtens ist XML geeignet für:
- Dauerhafte Speicherung von Daten (also im Sinne einer Archivierung)
- als Format zum Datenaustausch über Schnittstellen
- Repräsentation von strukturell komplexen Daten
Also alles Sachen, wo ein XML nicht ständig neu eingelesen und verarbeitet werden muss. Die Verarbeitung von XML ist nämlich nicht immer ganz so schnell, sodass häufige und aufwendige Arbeiten mit XML zu Performance-Einbußen im Programm führen können.
Treten solche Performance-Probleme dann auf, so muss man sich Gedanken um bessere Lösungen machen. Das heißt nicht zwangsläufig auf XML zu verzichten - so speichert dieses Forum seine Postings auch in XML-Dateien, hält aktuellen Daten aber in einem Background-Server-Prozess ständig im Arbeitsspeicher, sodass diese nicht bei jedem Aufruf aus den XML-Dateien ausgelesen werden müssen. Auch wird im Forums-Archiv der einmal generierte HTML-Code gecached, sodass auch hier nicht bei jedem Aufruf eines Threads im Archiv die XML-Datei ausgelesen, verarbeitet und daraus das HTML generiert werden muss.
Im Prinzip bist du damit aber dann wieder bei dem, was ich oben zu formulieren versuchte - nämlich XML nur für die „dauerhafte Speicherung” zu verwenden.
Viele Grüße,
~ Dennis.
Hallo Dennis!
Meines Erachtens ist XML geeignet für:
- Dauerhafte Speicherung von Daten (also im Sinne einer Archivierung)
- als Format zum Datenaustausch über Schnittstellen
- Repräsentation von strukturell komplexen Daten
Achso sieht das aus. Danke.
Ich habe aber immer noch das Problem, dass ich nicht weiß wie ich eine neue XML-Datei anlege.
Also wenn ich ein Gästebuch hätte, der erste Eintrag.
Bei einer Datenbank habe ich eine Tabelle in die ich schreiben kann,
aber wie mache ich das bei einer XML-Datei?
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?
Wenn ich erstmal eine Datei angelegt bekommen habe, will ich anfangen damit zu Experimentieren.
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?
Noch ein Problem, dass mir eine Datenbank erspart.
Danke!
Carsten
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.
Oft liegt es ja nur einfach daran, wie gut oder schlecht die Baumstruktur für entsprechende Zwecke angelegt ist und wie gut oder schlecht die Abfrage sind. Eigentlich die gleiche Debatte hinsichtlich native XML Datenbanken.
Hallo Dennis!
Oh danke, das hat mir sehr geholfen.
In Gedanken geh ich wenn ich einen ersten Eintrag setzen will also so vor:
if(file_exists(...)){
flock(LOCK_SH...) dann fopen(..., w+) dann lese ich den Inhalt, dann fclose() und wieder mit flock() frei geben wenn ich mich nicht irre
}else{
$vari = "<xml....><Die Elemente meiner XML-Datei></Die Elem...>";
fopen(..., w+) dann den String mit den XML-Elementen aus $vari rein schreiben und mit fclose() wieder schließen.
}
Damit sollte ich meinen ersten Eintrag hinbekommen oder?
Ich habe auch gelesen, dass Felix Riesterer (richtig geschrieben?) ein Gästebuch auf Basis einer XML-Datei programmiert hat.
Ist die Leistungseinbuße für solche Zwecke tatsächlich so dramatisch?
Danke für eure Geduld!
Carsten
Hi Carsten.Sch.,
flock(LOCK_SH...) dann fopen(..., w+)
Es hat schon seinen Sinn, warum ich LOCK_EX, sowie r+ und *nicht* LOCH_SH und w+ genommen habe. Lies bitte im PHP-Manual für fopen() (englische Version benutzen, die deutsche Übersetzung ist veraltet!) nach, was die Modi bedeuten und warum für den Fall, dass du Lesen und Schreiben willst nur r+ sinnvoll ist. In der Doku zu flock() steht dann auch, warum du beim Schreiben LOCK_EX nehmen solltest, während beim Lesen LOCK_SH genügt.
Also:
Wenn du nur Lesen willst
-> LOCK_SH und r
Wenn du nur Schreiben willst und dabei der alte Inhalt der Datei komplett gelöscht werden soll
-> LOCK_EX und w
Wenn du Lesen und Schreiben willst (löschen des Inhalts der Datei musst du mit ftruncate() selbst machen, natürlich erst nachdem du die Datei ausgelesen hast)
-> LOCK_EX und r+
$vari = "<xml....><Die Elemente meiner XML-Datei></Die Elem...>";
Genau so ;-) Alternativ könntest du auch mit DOM das XML von Grund auf erstellen, da bietet DOM meines Wissens ein paar Funktionen. Übrigens fehlt bei deinem XML-Dokument von oben eine XML-Deklaration, damit das ein gültiges XML-Dokument ist.
Ist die Leistungseinbuße für solche Zwecke tatsächlich so dramatisch?
Kommt drauf an, wie sauber du das implementierst ;-) Fang einfach mal an, optimieren kannst du später noch, insbesondere könnte das Cachen von Daten in einer besser bzw. schneller lesbaren Struktur am Ende die Geschwindigkeit erhöhen, falls du Performance-Probleme feststellst.
Viele Grüße,
~ Dennis.
@@Dennis:
Übrigens fehlt bei deinem XML-Dokument von oben eine XML-Deklaration, damit das ein gültiges XML-Dokument ist.
Live long and prosper,
Gunnar
Guten Morgen allerseits!
Dank Jeena Paradies Link hab ich zumindest eine Idee davon wie ich Datensätze in einer XML_Datei ändern und löschen kann.
Ich scheitere aber leider daran, den allerersten Datensatz zu speichern.
Ich find leider keine Anleitung dazu. Ich scheine wohl auf einem Auge ein bisschen blöd zu sein.
Könnte mir dazu bitte nochmal jemand einen Hinweis geben?
Eine schöne Woche wünsche ich!
Carsten