XML usw. mit PHP

Kimble

Erfahrenes Mitglied
hi,
ich hab jetzt immer wieder gelesen, dass man XML (XHTML oder was es da alles gibt :) ) mit PHP benuzten kann.
Ich kenn mich damit aber ueberhaupt nich aus.

Was fuer Vorteile hat man davon?
Und vor allem wie setze ich das ein?
Kennt jemand dafuer gute Tutorials?

HolyFly und Co. koennt ihr mir helfen?

Ich mein das so wie in dem Beitrag hier
 
Hallo Kimble,

Ich setze mittlerweile immer die Mischung JSP/Servlets / XML/XSL ein.
Auch wenn ich mal ab & zu PHP programmiere setze ich dies in verbinund mit XML /XSL ein.

Es gibt massig vorteile:
Lass mich eben auf die schnelle einen beleuchten.
Mann kann gemeinsam an einem Script arbeiten ohne sich auch nur annhähernd in die Query zu kommen und mann kann das Design ändern ohne auch nur eine zeile PHP Code anrühren zu müssen.

In einem Template System, kann mann auf sämmtliche Regulären Ausdrücke verzichten um Template Anweisungen zu finden.

Der XML Standard vom w3c definiert 2 Parse Methoden:
DOM & SAX.

Mit PHP nutze ich grundsätzlich SAX, da die XML unterstützung von PHP nicht so dicke ist.
Mit Java JDOM.

SAX durchläuft ein Dokument und bei jedem auftreten von XML Elementen (jedes XHTML Element ist auch ein XML Element) werden von mir bestimmte funktionen mit vorgegebenen Parameter aufgerufen.
Die wichtigsten Funktionen und ihre bedeutung:

$xml_parser = xml_parser_create();
// ist eine Factory die mir einen
//Parser zurückgibt der in dem handler
//xml_parser gespeichert wird

xml_set_element_handler($xml_parser,"startNode","endNode");
Definiere eine Handler funktion für
das auftreten von elementen.
Elemente ist z.b <buch> </buch>
beim Antreffen des Startelements wird die Funktion die als 2. Parameter angegeben wurde aufgerfuen.
Der 3. Parameter definiert die handlerfunktioin für das endtag
Der 1. Parameter muss ein gültiges handle
auf einen parser sein


xml_set_character_data_handler($xml_parser,"getData");

Disese anweisung legt die funktion getData() als diejenige Fest die aufgerufen wird wenn daten gelesen werden.


xml_parse($xml_parser,$quell);

Hier beginnt den Parsing prozess.
Bis das Document durchlaufen ist werden
die vorher definierten Funktionen aufgerufen. Der 1. Parameter ist
ein handle auf den definierten parser
der 2. Paramter ist der XML Text
 
Code:
 function startNode($parser,$name,$attrs){
   // tu was 
  }
  function getData($parser,$data){
    // tu was
  } 
  function endNode($parser,$name) {
    // tu was
 }

Das sind die Funktionen die ich vorher definiert habe.
die Paramter der starttag funktion sind immer
parser, name des ellements , Attribut array.

Attribut Array:
ein Element wie z.b <body hat eineige Attribute z.b <body bgcolor="#cccccc" valign="middle"
usw
diese werden in dem Attribut array gespeichert und können dann, dem beispiel entsprechend $attr["bgcolor"] abgerufen werden.

Der rest denke ich mal ist nicht schwer herauszubekommen ;)
 
Das ist ja alles sehr gut erklärt jedoch verstehe ich nicht wie ich zB wenn ich eine bla.xml habe und daraus eine Node in einer node haben will...

BSP:

bla.xml:

<land name="deutschland" kurz="de">
<stadt name="Berlin" type="Gross Stadt" lage="N/O">
<bevoelkerrung>45654245</bevoelkerrung>
</stadt>
<stadt name="Berlin1" type="Gross Stadt" lage="N/O">
<bevoelkerrung>45654245</bevoelkerrung>
</stadt>
<dorf name="Falkensee" lage="N/O">
<bevoelkerrung>45654245</bevoelkerrung>
</dorf>
<dorf name="Falkensee1" lage="S/W">
<bevoelkerrung>45654245</bevoelkerrung>
</dorf>
</land>

<land name="Frankreich" kurz="fr">
<stadt name="Paris" type="Gross Stadt" lage="N">
<bevoelkerrung>45654245</bevoelkerrung>
</stadt>
<stadt name="Paris1" type="Gross Stadt" lage="S">
<bevoelkerrung>45654245</bevoelkerrung>
</stadt>
<dorf name="Blabla" lage="N/O">
<bevoelkerrung>45654245</bevoelkerrung>
</dorf>
<dorf name="blublu1" lage="S/O">
<bevoelkerrung>45654245</bevoelkerrung>
</dorf>
</land>



so diese datei soll jetzt in php eingefügt werden und ich will nun zB nur das land deutschland haben und mir dort jede stadt als variable und den type usw...

BSP:

$stadt1name
$stadt1lage
$stadt1bevoelkerrung
$stadt1type

$stadt2name
$stadt2lage
$stadt2bevoelkerrung
$stadt2type

$dorf1name
$dorf1lage
$dorf1bevoelkerrung

$dorf2name
$dorf2lage
$dorf2bevoelkerrung

so will ich das ausgegeben haben...

wie mache ich das ?
und ich bitte euch wenns geht um ein kleines beispiel...

danke im vorraus!
 
also ich meine ich will das so handhaben wie bei mysql...

zb wenn ich ein guestbook mache, mache ich das für gewöhnlich so :

PHP:
             $query_2 = "SELECT *
                         FROM gb
                         ORDER BY id DESC" ;
             $sql->query($query_2);
             $ant4 =  $sql->rows();
             for($i=0; $i<$ant4;$i++)
             {
             $sql->next(); //steht bei mir für nächste zeile


                     $inhalt .= "<table cellspacing=\"0\" cellpadding=\"0\">
                                 <tr class=\"text\">
                                 <td width=\"200\"><b>".$sql->f(name)."</b>&nbsp;&nbsp;
                                 <a href=\"mailto:".$sql->f(email)."\"><img src=\"images/mail.gif\" alt=\"".$sql->f(email)."\" border=\"0\"></a></td>
                                 <td width=\"100\" align=\"right\">".$sql->f(datum)."</td>

                                 </tr>
                                 <tr class=\"text\">
                                 <td colspan=\"2\">".$sql->f(text)."</td>
                                 </tr>
                                 </table>
                                 <br>";

             }


$sql->f(text) steht bei mir für die spalte die er dort augeben soll...


und so zB will ich das auch mit einer XML datei machen wie geht das ??


und bitte schreibt mir keine englischen tutorial seiten als links... dann spart euch lieber die schreib arbeit :)

thx im vorraus...

MfG Ra
 
Zuletzt bearbeitet:
Steht doch schon da:
das ist die Callback funktion die immer aufgerufen wird
wenn die Start Node aufgefunden wird
Die parameter sind $parser, $name , $attrs
Das heisst um die land nodes zu seperieren
und dann das Attribut Land auszulesen:
$stadt1name
$stadt1lage
$stadt1bevoelkerrung
$stadt1type

$stadt2name
$stadt2lage
$stadt2bevoelkerrung
$stadt2type
Sowas ist schlechter Stil. Dafür sind Arrays doch wunderbar geeignet.
Noch besser währe eine Class Stadt zu schreiben, aber das lasse ich hier mal weg


sprich das ganze
PHP:
 function startNode($parser,$name,$attrs){
   global $laender,$aktuell;
    $aktuell = $name;
   if($name=="land")
      $laender[] = $attrs["name"];
  }
  
function getData($parser,$data){
   global $bevoelkerung;
   if($aktuell == "bevoelkerung")
       $bevoelkerung[] = $data;
}
usw.
 
ja ich verstehe was du meinst (denke ich zumindest) aber da reden wir irgendwie aneinader vorbei den wenn ich das so wie du mache bekomme ich ja alle länder namen...

also es kann auch sein das meine vorstellung von xml vollkommen falsch ist... mindest denke ich mir das so das (im meinem Bsp oben) Frankreich eine tabelle in meiner "datenbank" ist und deutschland eine... wenn ich das mal so vergleichen darf... und mein ziel ist es nur die daten von deutschland zu erhalten nach deiner möglichkeit wie du sie mir geschrieben hast bekomme ich ja auch die daten (nodes) von frankreich und deutschland...

also ich habe mir gestern ein buch gekauft über xml,jedoch bringt mich dieses kein stück weiter da es überhaupt nichts mit php zu tuen hat, naja was ich damit sagen will ist ich versuche ja schon xml zu verstehen, genauso habe ich viele tuts gelesen aber nirgendwo gefunden oder verstanden wie ich die "node" in einer "node" nur von einem "land" bekomme... daher meine frage ist das überhaubt möglich... anders erklärt will ich das beim auslesen alle länder bis auf zB deutschland ignoriert werden und ich nur die Daten (nodes) von deutschland bekomme.


ohh man viel text... ich hoffe ich habe mein problem weitgehend geschildert :)

...nehme es mir bitte nicht übel cris es kann sein das du mir ja das richtige erklären willst jedoch verstehe ich es so nicht :(

naja als fals du mal ein wenig zeit hast... also nicht nur du vieleicht weiss das ja auch jemand anders :) ... dann könnt ihr mir ja mal versuchen das ganzen für einen mega xml-noob zu erklären...


danke im vorraus...

MfG Ra
 
Original geschrieben von xamunrax
ja ich verstehe was du meinst (denke ich zumindest) aber da reden wir irgendwie aneinader vorbei den wenn ich das so wie du mache bekomme ich ja alle länder namen...

Nun wir reden nicht aufeinander vorbei.
Ich habe dir gezeigt wie du an daten rankommst die
Attributwerte, z.b <elem data="daten", sind und wie
du an Daten kommst die Textwerte eines Elements sind
<elem>daten</elem>

Wie du das nacher in welchen Variablen speicherst ist
ja nichts XML spefifisches und ja nur nebensache.
 
Zurück