molily: Verständnissproblem: XML(Datensammlung) -> PHP -> XHTML

Beitrag lesen

Hallo,

Jetzt will ich zum Beispiel das kleine Bild den Namen des Buches und den Autor auf meiner Seite anzeigen lassen. Wie kann ich da am besten vorgehen? Also ich habe wirklich keine Ahnung wie ich an die Sache rangehen soll. Soll ich das wirklich mit regulären Ausdrücken rausfischen? Das wäre bei größeren Datenmängen (sprich mehreren Büchern) ganz schön aufwendig denke ich.

Wenn die PHP-Extension DOMXML (http://de3.php.net/manual/en/ref.domxml.php) auf dem Server aktiviert ist und die PHP-Version relativ neu ist, kannst du z.B. so vorgehen, um den Inhalt eines Elements auszulesen:

$dom = domxml_open_mem($s, DOMXML_LOAD_PARSING, $error);
// var_dump($dom); print_r($error);
if ($dom and !$error) {
 $productname_elements = $dom->get_elements_by_tagname('ProductName');
 $productname_element = $productname_elements[0];
 $productname_textnode = $productname_element->first_child();
 $productname = $productname_textnode->node_value();
 // $productname ist ein UTF-8-kodierter String, weil der Baum aus kanonischem XML erstellt wurde. Konvertierung zu ISO-8859-1 mit:
 $productname = utf8_decode($productname);
 echo($productname);
}

$s ist hier der String mit dem XML-Dokument. Die anderen Elemente kannst du nach demselben Schema auslesen: Elementknoten nach dem Tagnamen mit get_elements_by_tagname lokalisieren (diese Methode funktioniert auch für Elementknoten), das erste Arrayelement wählen (ein Details-Element hat anscheinend sowieso nie zwei Elemente desselben Typs), den ersten Kindknoten wählen (den Textknoten) und dessen node_value abfragen.
(Es kann sein, dass der obige Code erst ab PHP 4.3.6 funktioniert...)

Wenn du DOMXML nicht zur Verfügung hast, kannst eventbasiert mit Expat arbeiten (http://de3.php.net/manual/en/ref.xml.php). Diese Funktionen sind im Gegensatz zu DOMXML standardmäßig aktiviert.
Du brauchst (quick'n'dirty) nur zwei Event-Handler, wenn im XML-Dokument die Daten eines Artikels enthalten sind: Einen Character-Data-Handler, der jeden Textknoteninhalt in eine globalen Variable schreibt (und überschreibt), und einen End-Tag-Handler, der immer dann, wenn ein Element geschlossen wird, dessen Inhalt dich interessiert, den in der globalen Variable zwischengespeicherten Textinhalt in einem Array sichert. Dann hast du nach dem Parsen des Dokuments alle gewünschten Daten zusammen.
Bei gewünschter Zuverlässigkeit und komplizierterem Markup wird die Programmlogik entsprechend aufwändiger. Man muss dann mit Abfragen arbeiten, die je nach dem jeweiligen Status (werden gerade Token innerhalb eines Details-Elements bearbeitet?) die Zeichendaten unter dem Index des jeweiligen Elementnamens sichern.

Wenn die von Amazon zurückgegebenen XML-Dateien immer gleich aussehen und dermaßen simpel sind, dann sind reguläre Ausdrücken möglicherweise brauchbar. Auch bei mehreren Datensätzen pro XML-Dokument kann diese Methode hinreichend zuverlässig sein, solange du dich auf die Dokumentstruktur verlassen kannst.

Mathias