Abfragemethode rename_element()

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:


<wetterdaten>
  -  <messtag date="2005-06-12">
  -     -  <messung typ="temp">15</messung>
  -     -  <messung typ="luftf">80</messung>
  -     -  <messung typ="druck">1011</messung>
  -  </messtag>
  -  <messtag date="2005-06-13">
  -     -  <messung typ="temp">20</messung>
  -     -  <messung typ="luftf">53</messung>
  -     -  <messung typ="druck">1050</messung>
  -  </messtag>
  -  <messtag date="2005-06-14">
  -     -  <messung typ="temp">22</messung>
  -     -  <messung typ="luftf">40</messung>
  -     -  <messung typ="druck">1124</messung>
  -  </messtag>
</wetterdaten>

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();
?>



<wetterdaten>
  -  <messtag date="2005-06-12">
  -     -  <temperatur typ="temp">15</temperatur>
  -     -  <luftfeuchtigkeit typ="luftf">80</luftfeuchtigkeit>
  -     -  <druck typ="druck">1011</druck>
  -  </messtag>
  -  <messtag date="2005-06-13">
  -     -  <temperatur typ="temp">20</temperatur>
  -     -  <luftfeuchtigkeit typ="luftf">53</luftfeuchtigkeit>
  -     -  <druck typ="druck">1050</druck>
  -  </messtag>
  -  <messtag date="2005-06-14">
  -     -  <temperatur typ="temp">22</temperatur>
  -     -  <luftfeuchtigkeit typ="luftf">40</luftfeuchtigkeit>
  -     -  <druck typ="druck">1124</druck>
  -  </messtag>
</wetterdaten>

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.