Home Sitemap Impressum
SEO Welten - Webcoding, Editoren, Scripte und Anwendungen
SEO Welten

 

 
AGB
Buchempfehlungen

Drei Wege, um mit SimpleXML Attribute auszulesen

Auslesen von Attributen mit der Funktion attributes() - Teil 1

Übersicht / Seite:

  1. Auslesen von Attributen (deren Namen und Werte, mit attributes()) Teil 1
  2. Der zweiter Weg (Auslesen mit der Funktion children()) Teil 2
  3. Der dritter Weg (Ansprechen der Knoten mit XPath) Teil 3

Das Auslesen von Attributen bzw. deren Namen und Werte aus einem XML-Dokument mit Hilfe von PHP und SimpleXML bereitet Einsteigern zuweilen leichte Probleme, ist jedoch mit etwas Übung nicht schwerer als die Verarbeitung des restlichen Inhaltes einer XML-Datei. Nachfolgend einige unterschiedliche Wege, um mit Hilfe von PHP und SimpleXML sowie den Funktionen attributes() und children() die Namen und Inhalte von Attributen aus einem XML-Dokument auszulesen und weiter zu verarbeiten.

Zuerst ein Beispiel für eine XML mit Attributen. Diese Datei wurde in einer Testumgebung unter fluesse.xml abgespeichert und diente als Vorlage für alle weiteren Beispiele.

Die XML-Beispieldatei: fluesse.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
- <Response>
  - <Request>
    - <Fluesse>
        <Fluss Name="Nil" Laenge="6.852"/>
        <Fluss Name="Amazonas" Laenge="6.448"/>
        <Fluss Name="Jangtsekiang" Laenge="6.380"/>
        <Fluss Name="Mississippi" Laenge="3.778"/>
        <Fluss Name="Jenissei" Laenge="5.540"/>
        <Fluss Name="Ob" Laenge="3.650"/>
        <Fluss Name="Amur" Laenge="2.824"/>
      </Fluesse>
    </Request>
  </Response>

Bevor eine Datei geöffnet, eingelesen und verarbeitet werden kann, sollte erst einmal deren Vorhandensein mit der PHP-Funktion file_exists() überprüft werden. Zumindest steht es so oftmals geschrieben.

Beispiel für das Laden von Dateien vom eigenen Server oder eigenen Webspace:

<?php

$datei = "fluesse.xml";

    if (file_exists($datei)) {

        $Response = simplexml_load_file($datei);

        print_r($Response);
		
} else {echo "Fehler beim Laden der Datei: ".$datei."\n";
       }

?>

Soweit, so gut. Leider hat die Angelegenheit einen Schönheitsfehler, denn mit file_exists() lassen sich nur Dateien auf Vorhandensein überprüfen, die auf dem eigenen Server liegen. Zur Prüfung von entfernten Dateien ist die Funktion file_exists() schlicht und einfach unbrauchbar. Doch ein per Web Services angefordertes XML-Dokument liegt nur selten auf dem eigenen Server. Um dennoch für den Fehlerfall gerüstet zu sein, sollten PHP seitige Fehlermitteilungen mit @ abgefangen werden, jedoch nicht ohne mit exit() oder dem gleichwertigen Sprachkonstrukt die() die weitere Ausführung des Scripts bzw. den weiteren Programmablauf beim Auftreten eines Fehlers während des Ladevorgangs zu unterbrechen und eine eigene Fehlermitteilung auszugeben.

Codeschnipsel für das Laden von externen (fernen) Dateien:

<?php

$datei = "http://www.seo-welten.de/fluesse.xml";

          $Response = @simplexml_load_file($datei) or
          die ("Fehler beim Laden der Datei: ".$datei."\n");

          print_r($Response);

?>

Eine weitere Möglichkeit beim Laden von entfernten Dateien besteht in der Überprüfung des Rückgabewertes, da die Funktion simplexml_load_file() im Fehlerfall mit False antworten würde. Doch auch bei dieser Variante sollten PHP Fehlermitteilungen mit @ abgefangen und eigene Meldungen ausgegeben werden.

Zweiter Codeschnipsel für das Laden von entfernten Dateien:

<?php

$datei = "http://www.seo-welten.de/fluesse.xml";

      if (@simplexml_load_file($datei) !== false){

          $Response = simplexml_load_file($datei);

          print_r($Response);

}   else {echo "Fehler beim Laden der Datei: ".$datei."\n";}

?>

 
Auslesen von Attributen, deren Namen und Werten mit attributes()

Nach dem erfolgreichem Laden der XML wird im nächsten Beispiel zuerst mit der Funktion count() die Anzahl der Attribute gezählt und in der Variablen $laufebis gespeichert, da diese Anzahl für die Zähschleife als Endwert benötigt wird. Im Anschluss werden mit Hilfe der Foreach-Schleife alle Attributnamen und Werte ausgelesen und aufgelistet. Der Zeilenumbruch innerhalb der runden Klammern der Foreach-Schleife sollte der Übersichtlichkeit wegen vermieden werden, der Funktionalität tut es hingegen keinen Abbruch und die Foreach findet und durchläuft den Array auch so.

Erstes Codebeispiel mit der Funktion attributes():

<?php

$datei = "fluesse.xml";

    $Response = @simplexml_load_file($datei) or
     die ("Fehler beim Laden der Datei: ".$datei."\n");

    $laufebis = count($Response->Request->Fluesse->Fluss);

for ($laufe = 0; $laufe < $laufebis; $laufe++) { 

    foreach ($Response->Request->Fluesse->Fluss[$laufe]->
    attributes() as $namen => $attribute) {

    echo $namen." ".$attribute." ";
}
echo "<br>\n";
}

?>

Das Listing im Beispiel würde folgende Ausgabe liefern:

Name Nil Laenge 6.852
Name Amazonas Laenge 6.448
Name Jangtsekiang Laenge 6.380
Name Mississippi Laenge 3.778
Name Jenissei Laenge 5.540
Name Ob Laenge 3.650
Name Amur Laenge 2.824

Zur eigenen Anschicht des Inhaltes der Attribute aus der XML reicht es, nur ein Blumentopf ist damit noch nicht zu gewinnen. Geht es nur darum den Inhalt ohne die Namen der Attribute in einer Liste darzustellen, so könnte das Beispiel wie folgt abgeändert werden.

Zweites Codebeispiel mit der Funktion attributes():

<?php

$datei = "fluesse.xml";

    $Response = @simplexml_load_file($datei) or
    die ("Fehler beim Laden der Datei: ".$datei."\n");

$laufebis = count($Response->Request->Fluesse->Fluss); 

echo "\t<ul>\n";

for ($laufe = 0; $laufe < $laufebis; $laufe++) {

    echo "\t<li>";

    foreach ($Response->Request->Fluesse->Fluss[$laufe]->
    attributes() as $alpha) {

    echo $alpha." ";
    }
  echo "</li>\n";
}
echo "\t</ul>\n";

?>    

Das Listing würde diese Ausgabe liefern:

  • Nil 6.852
  • Amazonas 6.448
  • Jangtsekiang 6.380
  • Mississippi 3.778
  • Jenissei 5.540
  • Ob 3.650
  • Amur 2.824

Immer dann, wenn nur ein bestimmter Wert von einem Attribut oder ein bestimmtes Wertepaar ausgelesen werden soll und zur Auswahl ein IF-Statement oder eine Switch-Case Fallunterscheidung verwendet werden soll, müsste die Vorgehensweise geändert werden. Nachfolgend ein Beispiel, in dem mit Hilfe der Funktion strpos() abgefragt wird, ob sich der Name Jenissei als Wert in einem Attribut befindet und nur das Wertepaar ausgegeben wird, welches diese Bedingung erfüllt.

Drittes Codebeispiel mit der Funktion attributes():

<?php

$datei = "fluesse.xml";

     $Response = @simplexml_load_file($datei) or
     die ("Fehler beim Laden der Datei: ".$datei."\n");

     $laufebis = count($Response->Request->Fluesse->Fluss); 


for ($laufe = 0; $laufe < $laufebis; $laufe++) {

     $alpha = $Response->Request->Fluesse->Fluss[$laufe]->attributes(); 

     if (strpos($alpha["Name"], "Jenissei") !== false){

     echo $alpha["Name"]." - ".$alpha["Laenge"]." km<br>\n";
     }
}

?>    

Dieses Codebeispiel würde folgende Ausgabe bewirken:

Jenissei - 5.540 km

Nachdem die bisherigen Beispiele auf die PHP-Funktion attributes() aufbauten, wird auf der nächsten Seiten noch ein zweiter und dritter Weg vorgestellt, wobei in den ersten beiden Beispielen die Funktion children() zur Anwendung kommt und im letztem Beispiel die Knoten eines XML-Dokuments mit Hilfe von SimpleXML und XPath direkt angesprochen werden.

weiterlesen: Auslesen von Attributen - Teil 2 | Teil 3

Navigation

Finden und
gefunden werden ...


Autoritäten im
Internet

Die Kehrseite
Das Wesen

Zukunftsaussichten

Studien & Strategien
Verbreitung & Bedeutung
Internet & Medien


- Optimierung -

Einstieg Optimierung
Erfolg oder Misserfolg

 

Webcoding

Übersicht

Einführung ins Thema


Amazon Web Service
Request und Response
Anfragen und Anträge
Weitere Beispiele
Einfaches Script - Unicode
Einfaches Script - ISO
Weitere Einzelheiten


Images/Bilder prüfen
Einbinden von Dateien


RegEx

Reguläre Ausdrücke


Copyright © 2006 - Verlag Horst Müller - Stendal | Datenschutz | Nutzungsbedingungen