In diesem Tutorial will ich euch zeigen, wie ihr mittels PHP auf XML-Dateien zu greift, diese auslest, editiert und schreiben könnt. Ich werde versuchen ein News-System mit XML zu erstellen, so dass ihr es in der Praxis sehen könnt.
Ich versuche euch mittels SimpleXML und DOM euch zu erklären, wie man neue Techniken nutzt und damit ein Newssystem verwalten kann. Ich betone aber hier, dass ich nicht vorhabe ein komplettes System auf die Beine zu stellen, sondern nur die wichtigsten Fkt. zu erklären, wie Schreiben, Lesen, Editieren.
Alle Sachen, was XML und PHP entspricht, sind nachzulesen auf www.php.net und http://www.w3.org/XML/
Ich möchte euch auch nochmal darauf hinweisen, dass dieses Tutorial das Verstehen von PHP und den Umgang mit www.php.net vorraussetzt.
2.Das erste Skript mit SimpleXML
So damit wir nicht Zeit verlieren erstellen wir uns erstmal eine XML-Datei, die später erweitert werden soll, um sie in unserem News-System zu nutzen.
Die XML-Datei (news.xml):
Code :
1 2 3 4 5 6 7 8 | <?xml version='1.0'?>
<news>
<id>1</id>
<title>News-System</title>
<author>KoMtuR</author>
<description>Wir bauen uns ein News-System mittels XML</description>
<date>1097688183</date>
</news> |
Nun wollen wir einfach diese Datei mittels php und SimpleXML formatiert ausgeben.
Die PHP-Datei:
PHP-Code:
<html>
<head>
<title>tutorial1.php - XML-Dateien lesen</title>
</head>
<body>
<?php
$filename = 'news.xml';
if(file_exists($filename)) {
$xml = simplexml_load_file($filename); //Lädt die XML-Datei in ein
//Objekt
if($xml) { //Prüfen, ob Datei Fehler enthielt
?>
<table>
<tr>
<td>Überschrift</td>
<td><?php echo $xml->title ?></td>
</tr>
<tr>
<td></td>
<td><?php echo $xml->description ?></td>
</tr>
<tr>
<td><?php echo date("H:i:s d.m.y", $xml->date) ?></td>
<td><?php echo $xml->author ?></td>
</tr>
</table>
<?php
} else {
echo ' <p>Die Datei names '. $filename .' konnte nicht geöffnet werden</p>';
}
}
?>
Weiteres Beispiel:
Code :
1 2 3 4 5 | <parent>
<child1>
<child2>childNode</child2>
</child1>
</parent> |
Bei dieser Verschachtelung könnte man auf den Inhalt von <child2></child2> so zugreifen:
PHP-Code:
<?php
//[...]
echo $xml->parent->child1->child2;
?>
3.Das zweite Skript mit SimpleXML
Nun wollen wir eine XML-Datei auslesen, welche mehrere Datensätze enthält. Also können wir unserem News-System schon eine Funktion hinzufügen – Auslesen der News.
Dies geschieht in Grundzügen genauso wie das erste Skript, nur das wir als Objekt ein Array erhalten
Hier die XML-Datei (news.xml):
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?xml version='1.0'?>
<system>
<news>
<id>2</id>
<title>News-System die 2.</title>
<author>KoMtuR</author>
<description>Wir lesen mehrere Datensätze aus einer XML-Datei</description>
<date>1097688200</date>
</news>
<news>
<id>1</id>
<title>News-System</title>
<author>KoMtuR</author>
<description>Wir bauen uns ein News-System mittels XML</description>
<date>1097688183</date>
</news>
</system> |
Und hier der PHP-Code:
PHP-Code:
<?php
$filename = 'news.xml';
if(file_exists($filename)) {
$xml = simplexml_load_file($filename);
if($xml) {
foreach($xml->news as $news) {
?>
<table>
<tr>
<td>Überschrift</td>
<td><?php echo $news->title ?></td>
</tr>
<tr>
<td></td>
<td><?php echo $news->description ?></td>
</tr>
<tr>
<td><?php echo date("H:i:s d.m.y", $news->date) ?></td>
<td><?php echo $news->author ?></td>
</tr>
</table>
<?php
}
} else {
echo ' <p>Die Datei names '. $filename .' konnte nicht geöffnet werden</p>';
}
}
?>
Nun ist bekannt, wie man mit SimpleXML eine einfache XML-Datei ausliest und weiterverarbeitet.
Das nächste Thema wird sein eine Datei zu editieren und neue Datensätze hinzuzufügen.
4.XML-Datei editieren mittels DOM
In diesem Kapitel will ich euch mit den integrierten DOM Funktionen von PHP5 erklären, wie ihr eine Datei editieren könnt und dazu auch neue Datensätze hinzufügen könnt. Man könnte dies zwar auch mit SimpleXML bewerksetlligen, aber ich empfinde die DMO-Funktionen für sinnvoller, weil diese eine leichtere Handhabung mit der XML-Datei besitzen.
Weil wir natürlich in unserem News-System auch neue Datensätze hinzufügen wollen und vielleicht einem Admin die Möglichkeit bieten wollen Datensätze zu editieren will ich euch die DOM näher bringen.
Um eine XML-Datei mittels der DOM-Funktionen zu öffnen brauchen wir die Fkt. domxml_open_file(). Wir wollen nun ein Datensatz auslesen mit einer bestimmten ID und Diesen erstmal anzeigen lassen.
PHP-Code:
<?php
$doc = DOMDocument::load("news.xml");
$xp = new domxpath($doc);
$titles = $xp->query('news[id="1"]');
foreach ($titles as $node) {
foreach($node->childNodes as $cnode) {
if($cnode->nodeType == 1) {
print $cnode->nodeName .": ". $cnode->textContent . "\n";
}
}
}
?>
Dieses XPath-Objekt ist in diesem Sinne sinnvoll, weil wir dadurch spezielle Datensätz raussuchen können.
PHP-Code:
<?php
$titles = $xp->query('news[id="1"]');
?>
Nun wollen wir aber nicht nur ein bestimmten Datensatz anzeigen lassen sondern ihn auch bearbeiten.
Sagen wir, dass wir den Inhalt von <description></description> der News, mit der ID= "1", ändern wollen.
Hier erstmal der Code.
PHP-Code:
<?php
$edit = "description";
$edit_content = "Dieser Text wurde editiert";
$doc = DOMDocument::load("news.xml");
switch($edit) {
case "description":
$newtag = $doc->createElement("description");
$newtag_content = $doc->createTextNode($edit_content);
$newtag->appendChild($newtag_content);
break;
default:
break;
}
$xp = new domxpath($doc);
$titles = $xp->query('news[id="1"]');
foreach ($titles as $node) {
foreach($node->childNodes as $cnode) {
if($cnode->nodeType == 1) {
if($cnode->nodeName == $edit) {
$cnode->parentNode->replaceChild($newtag, $cnode);
}
}
}
}
echo $doc->saveXML();
?>
Die Funktion createElement() erstellt ein neues XML-Tag und createTextNode() erstellt den Inhalt dafür. Mit appendChild() wird dem erstellten XML-Tag die Zeichenkette zugewiesen. Per XML würde das Beispiel so aussehen:
Code :
1 | <description>Dieser Text wurde editiert</description> |
Nun müssen wir nur noch den speziellen Tag herausfinden, welchen ihr editieren wollt. Dies geschieht in diesem Abschnitt. Dort wird dann der alte Tag durch den neuen ersetzt.
PHP-Code:
if($cnode->nodeName == $edit) {
$cnode->parentNode->replaceChild($newtag, $cnode);
}
Somit haben wir diese Datei fast komplett editiert und müssen die nur noch speichern. Entweder ihr macht das mit fopen() und saveXML(). Oder ihr verwendet die mitgelieferte DOM-Funktion save().
PHP-Code:
<?php
$doc->save('news.xml');
?>
Nun kommen wir zu einem inertessanten Thema, aber zugleich auch Schwierigen. Wir wollen einen Datensatz hinzufügen in der Datei.
Ich werde es wieder auf dieses Newssystem beziehen und werde den neuen Datensatz somit immer am Anfang der XML-Datei einfügen, damit die letzte News immer an erster Stelle eingefügt wird und somit wir dem „ausgebe“-Skript schon die nötige Arbeit abnehmen.
Mir ist eine Sache bei diesem Script aufgefallen, dass ihr selber lösen könnt. Ich hab erstmal ne ID mit nur einer Zahl vergeben, indem er die Einträge zählt. Dies ist aber nicht gut, weil wenn man ein Datensatz löscht 2 News die gleiche ID haben können. Ihr könnt dies entweder mit einer anderen ID lösen, also mehrere Sachen für eine ID verwenden (zb. Timestap+anzahl der Datensätze) oder ihr speichert euch einen Zähler in diese XML-Datei.
Hier ist erstmal der Code, wie wir einen neuen Newsbeitrag in diese Datei speichern. Nicht erschrecken. Es wird alles noch erklärt danach.
PHP-Code:
<?php
$title = "News Nr. 3";
$author = "KoMtuR";
$date = time();
$desc = "Von uns erstellt";
$doc = DOMDocument::load("news.xml");
$xp = new domxpath($doc);
$id = 0;
foreach ($doc->documentElement->childNodes as $articles) {
if ($articles->nodeType == 1 && $articles->nodeName == "news") {
$id++;
}
}
$id++;
$newxml = <<< XML
<?xml version='1.0'?>
<news>
<id>$id</id>
<title>$title</title>
<author>$author</author>
<description>$desc</description>
<date>$date</date>
</news>
XML;
$doc2 = DOMDocument::loadXML($newxml);
$xpath = new DOMXPath($doc2);
$query = $xpath->query("/news");
foreach($query as $node) {
$import = $node->cloneNode(true);
}
$onewxml = $doc->importNode($import, true);
$firstNode = $doc->getElementsByTagName("news");
$doc->documentElement->insertBefore($onewxml, $firstNode->item(0));
$doc->save("news.xml");
?>
PHP-Code:
$id = 0;
foreach ($doc->documentElement->childNodes as $news) {
if (($news->nodeType == 1) && ($news->nodeName == "news")) {
$id++;
}
}
$id++;
PHP-Code:
$doc2 = DOMDocument::loadXML($newxml);
$xpath = new DOMXPath($doc2);
$query = $xpath->query("/news");
foreach($query as $node) {
$import = $node->cloneNode(true);
}
$onewxml = $doc->importNode($import, true);
Dann wird mittels dem DOMXPath-Objekt eine neue Abfrage gestartet und unseren neuen Datensatz nach dem Tag "news" durchsucht.
Dieser wird mittels cloneNode(true) kopiert und in $import gespeichert. Das true gibt an, dass auch die Kinderelemente von <news></news> mitkopiert werden sollen.
mit $doc->importNode($import, true) veranlasst man im Originaldokument, dass ein neuer Datensatz importiert wird. Dieser wird aber noch nicht an der Stelle eingefügt. Er wird nur auf das Einfügen vorbereitet.
Das Einfügen geschieht mit:
PHP-Code:
$firstNode = $doc->getElementsByTagName("news");
$doc->documentElement->insertBefore($onewxml, $firstNode->item(0));
$doc->save("news.xml");
?>
Somit haben wir nun unsere neue News an erster Stelle, wenn die XML-Datei wieder ausgelesen wird.
Im Großen und Ganzen war es das erstmal für die Einführung. Speziellere Wünsche überbleiben eurer Phantasie und die ganzen Fkt. kann man auch auf www.php.net nachlesen.


Bereiche
Kategorien
Forum - Programming
danke
tutorials.de-Systemmitteilung