XML-Elemente, deren eigentlicher Sinn sich erst über ein Attribut definieren, sind auf normalem Weg sehr unkomfortabel einzulesen. Dennoch begegnet man solchen Strukturen immer wieder. Hier ein stark vereinfachtes Beispiel:
Hier kann eine Transformation der Elementnamen wesentliche Erleichterung bringen, wie anschließend gezeigt wird.
<?php
require_once("../xml-line.php");
$mylines = new xml_line("xml-files/wetterdaten.xml" , "hixml");
$arg1=array("0", "messung","", array('typ' => 'temp'));
$arg2=array("0", "messung","", array('typ' => 'luftf'));
$arg3=array("0", "messung","", array('typ' => 'druck'));
$mylines->rename_element ($arg1, "temperatur");
$mylines->rename_element ($arg2, "luftfeuchtigkeit");
$mylines->rename_element ($arg3, "druck");
$mylines->xml_stream();
echo $mylines->get_output();
?>
Nun hat man die Daten so, dass man die get_record()-Methode verwenden kann.
Im Folgenden lassen wir uns aber nicht den XML-String anzeigen und speichern ihn auch nicht in einer Datei zwischen, sondern übergeben ihn an ein neues XML-Line-Objekt. Aus kosmetischen Gründen entfernen wir auch gleich noch die überflüssig gewordenen Attribute.
<?php
require_once("../xml-line.php");
//Achtung: Ausgabeformat ist XML!
$mylines = new xml_line("xml-files/wetterdaten.xml" , "xml");
$arg1=array("0", "messung","", array('typ' => 'temp'));
$arg2=array("0", "messung","", array('typ' => 'luftf'));
$arg3=array("0", "messung","", array('typ' => 'druck'));
$mylines->rename_element ($arg1, "temperatur");
$mylines->rename_element ($arg2, "luftfeuchtigkeit");
$mylines->rename_element ($arg3, "druck");
//Alle Attribute mit Namen "typ" entfernen:
$attrarg = array(0,'','','typ');
$mylines->delete_attribute($attrarg);
$mylines->xml_stream();
$transformation = $mylines->get_output();
// neuen XML-String direkt parsen:
$secondpass = new xml_line($transformation);
$secondpass->get_record(0,"messtag");
$secondpass->xml_stream();
$wdaten_arr = $secondpass->table_result[0];
?>
Das reduzierte Ergebnisarray lassen wir mit print_r($wdaten_arr) ausgeben:
Array ( [0] => Array ( [_@date] => 2005-06-12 [temperatur] => 15 [luftfeuchtigkeit] => 80 [druck] => 1011 ) [1] => Array ( [_@date] => 2005-06-13 [temperatur] => 20 [luftfeuchtigkeit] => 53 [druck] => 1050 ) [2] => Array ( [_@date] => 2005-06-14 [temperatur] => 22 [luftfeuchtigkeit] => 40 [druck] => 1124 ) )
Nun sollte es z.B. keine Schwierigkeiten mehr machen, die erfassten Daten in eine Datenbank einzulesen oder sie mit einer halbwegs brauchbaren Templateklasse direkt auszugeben.