Webcity.pl


  Kompilacja PHP w sys...

  5 niezbędnych czynni...

  Język marketingu

  Czym jest marketing ...

  Piszemy Engine cz. 4

 

 02.02.06 - [new] E-video - artykuł

 30.01.06 - [update] Artykuł o sesjach

 18.12.05 - [update] PDO - artykuł

 19.08.05 - [new+upd] Aktualizacja materia...

 26.04.05 - [update] Nowy artykuł



  Pomocy WML
[php]Sesje nie działają, ...
[actionscript 2.0] [flash...
Problem z talicami w php
[ocena] llll.pl darmowe a...
Kamera na stronie interne...
Kamera na stronie interne...
[xml] Jak wyciągnąć dane
Wizualizacja w JS - POMOC
Web Developer - stała / f...

... i wiele innych wątków na forum ›

Partnerzy
› allRSS.info - katalog zasobów RSS
› iloveflyer.org - webdesign
› webserv.pl - serverpack
› skryptoteka.pl - mnóstwo skryptów
› vel.pl - hosting
› TelePraca.net - pracuj swobodnie
› PHP Solutions - magazyn PHP
› HELION - wydawnictwo informatyczne

Ksišżka dnia

CityMag
Wpisz swój e-mail, aby zaprenumerować nasz Magazyn, który zawiera najnowsze informacje ze świata i najciekawsze teksty.
 

Szukasz czegoś?
Nasza wyszukiwarka znajdzie wszystko, czego szukasz.
 

Szukanie zawansowane


  Reklama
  Redakcja
  Hosting
  Kanał

© WebCity.pl Team
 
 
  Forum Forum
Kursy Kursy
Porady Porady
Recenzje Recenzje
Newsy Newsy
Katalog stron WWW Katalog
Skrypty PHP Skrypty
Download Oferty i praca
Artykuły:
 Teoria
 Praktyka
 Promocja
 Inne
 

 Webcity.pl |

Jak PHP obsługuje XML?

Autor: Zyx
   XML - ten metajęzyk robi powoli coraz więcej zamieszania w internecie. Dlaczego? Ponieważ dzięki niemu możesz w prosty sposób przechowywać najróżniejsze informacje. XML jest po prostu językiem do opisu wszystkiego, a przykładem może być tu HTML, który właściwie jest jakby jego "dzieckiem" :]. Przypomnij sobie, jak łatwo w HTML'u opisać wygląd strony WWW. Czemu więc tego nie wykorzystać do przechowywania danych? Autorzy PHP myśleli tak samo i udostępnili nam specjalne rozszerzenie do jego obsługi: php_xml.

   1. Instalacja rozszerzenia
W zasadzie nic nie musisz robić :]. Pod Windowsem php_xml jest wbudowany w PHP, natomiast w systemach unixowych PHP jest domyślnie z jego obsługą kompilowane, więc nie trzeba się niczego obawiać. Mimo tego, zanim wykorzystasz XML na swojej stronie WWW, zapytaj lepiej administratora, czy serwer obsługuje to rozszerzenie (bo jednak da się skompilować PHP bez niego).

   2. Wprowadzenie
Obsługa XML'a w PHP sprowadza się do zainicjowania parsera, ustawienia dla niego odpowiednich informacji, a następnie wprowadzania do niego kolejnych linii pliku (o ich wczytanie musimy zadbać sami). Jak to wygląda w praktyce? Rzućmy okiem...
Na początek przykładowy plik XML (później będą bardziej twórcze przykłady, ten jest tylko po to, by zademonstrować ogólną zasadę parsowania):

<?xml version="1.0" encoding="iso-8859-2"?>
<xml>
   <tag name="Tag 1">
      <blebleble />
   </tag>
   <tag name="Tag 2">
      <blablabla />
   </tag>
</xml>

Teraz czas na parser :]

<?php

   function tag_start($parser, $attr, $params){ // 1
      echo 'Znaleziono nowy tag: '.$attr.' z parametrami ';
      print_r($params);
      echo '<br>';
   }
   
   function tag_end($parser, $attr){ // 2
      echo 'Koniec tagu '.$attr.'<br>';
   }

   $parser = xml_parser_create(); // 3
   
   xml_set_element_handler($parser, 'tag_start', 'tag_end'); // 4
   
   if(!($fp = fopen($_GET['file'], "r"))) { // 5
      die("Nie można otworzyć podanego pliku XML!!!");
   }

   while($data = fread($fp, 4096)) {
      if(!xml_parse($parser, $data, feof($fp))){ // 6
         die(sprintf("Błąd XML: %s w linii %d",
               xml_error_string(xml_get_error_code($_parser)),
               xml_get_current_line_number($parser)));
         }
      }
   xml_parser_free($parser); // 7

?>

Opis:
   1 -> To jest nasza funkcja, która będzie obrabiała tagi otwierające, czyli bez / w nazwie (np. <tag>). Musi ona koniecznie pobierać trzy parametry: parser, nazwa atrybutu, tablica parametrów.
   2 -> Ta funkcja będzie obsługiwała zamknięcie tagów.
   3 -> Tworzymy zasób parsera w zmiennej $parser.
   4 -> Informujemy parser, że do obróbki tagów ma wykorzystać funkcje "tag_start" i "tag_end".
   5 -> Niestety o wczytanie pliku XML musimy zadbać sami. Skrypt ten musimy wywołać z parametrem file=nazwa_pliku.xml
   6 -> Wprowadzamy dane do parsera i ewentualne błędy wyświetlamy (następna linia).
   7 -> Następnie zwalniamy pamięć przydzieloną parserowi.
Jak widać napisanie parsera XML'a nie jest wcale takie trudne. Rzeczywistość niestety nie jest tak różowa, zwykle trzeba trochę pogłówkować, by wszystko działało tak, jak trzeba.

   3. Dane o redaktorach w pliku XML
Teraz przykład trochę bardziej praktyczny: na stronie chcesz zamieścić informacje o redaktorach serwisu. Tutaj doskonale do tego zadania nadaje się XML - bez problemu przecież można utworzyć plik, za pomocą którego skrypt wygeneruje odpowiedni kod HTML. Oto przykładowy plik:

<?xml version="1.0" encoding="iso-8859-2"?>
<redakcja>
   <redaktor id="1">
      <ksywa>zar00st</ksywa>
      <personalia imie="Jan" nazwisko="Nowak" />
      <mail>zar00st@fryzjerzy.pl</mail>
      <www>http://www.zar00st.pl</www>
      <prawa>Administrator</prawa>
      <opis>Jestem głównym administratorem serwisu bleblebleble...</opis>
   </redaktor>
   <redaktor id="2">
      <ksywa>Cyc</ksywa>
      <personalia imie="Waldemar" nazwisko="Kiepski" />
      <mail>waldek@kiepscy.pl</mail>
      <www>http://www.kiepscy.pl</www>
      <prawa>Redaktor</prawa>
      <opis>Zajmuję się degustacją różnych browarów, oraz ich recenzjami.</opis>
   </redaktor>
   <redaktor id="3">
      <ksywa>WinSock</ksywa>
      <personalia imie="Kalasanty" nazwisko="Kowalski" />
      <mail>kali@lubudubu.afg</mail>
      <prawa>Programista</prawa>
      <opis>Hej, to ja napisałem całe to czadziorskie oskryptowanie :].</opis>
   </redaktor>
   <redaktor id="4">
      <ksywa>Summer</ksywa>
      <personalia imie="Józef" nazwisko="Lewy" />
      <mail>lewy@poczta.costam.pl</mail>
      <www>http://www.zwiazek_idiotow_polskich.zip.pl</www> <!-- no co??? :]-->
      <prawa>Promocja</prawa>
      <opis>Moja praca polega na rozsławianiu strony w necie i nie tylko.</opis>
   </redaktor>
</redakcja>

Teraz zajmiemy się napisaniem odpowiedniego parsera. Najważniejszą rzeczą, jaką będziesz umiał wykonać dzięki temu przykładowi, to obsługa danych wprowadzonych pomiędzy tagi np. "<tag>tekst</tag>". Dowiesz się również, na co należy zwracać uwagę podczas pisania takowego parserka. A więc zaczynamy!

   Na początku zdefiniujemy sobie prostą klasę, która posłuży nam do budowy tablicy redaktorów:

<?php

   class redaktor{
      var $id;
      var $nick;
      var $imie;
      var $nazwisko;
      var $mail;
      var $www;
      var $funkcja;
      var $opis;

      function redaktor($id){
         $this -> id = $id;
         $this -> www = '';
      }

      function PobierzPersonalia(){
         return $this -> imie.' '.$this -> nazwisko;
      }
   }

Następnie ustawiamy kilka zmiennych:

   $int = 0;
   $redakcja = array();
   $czy_redaktor = 0;

$int to zmienna trzymająca numer aktualnie wczytywanego redaktora, $redakcja to tablica zmiennych typu 'redaktor', a $czy_redaktor określa, czy aktualnie znajdujemy się w znaczniku REDAKTOR, czy nie. Teraz czas na funkcję przetwarzającą otwarcie tagu:

   function tag_start($parser, $attr, $params){
      global $act_tag, $int, $redakcja, $czy_redaktor;
      if($attr == 'REDAKTOR' && $czy_redaktor == 1){
         die('Błąd: Niedozwolone zagnieżdżenie redaktorów! :]<br>');
      }elseif($attr == 'REDAKTOR' && $czy_redaktor == 0){
         $redakcja[$int] = new redaktor($params['ID']);
         $czy_redaktor = 1;
      }

      if($czy_redaktor == 1){
         if($attr != 'PERSONALIA'){
            $act_tag = $attr;
         }else{
            $redakcja[$int] -> imie = $params['IMIE'];
            $redakcja[$int] -> nazwisko = $params['NAZWISKO'];
         }
      }
   }

Jak widzisz, tym razem funkcja ta zawiera trochę warunków do sprawdzenia. Są one konieczne, gdyż dzięki właśnie takiej konstrukcji skrypt nasz wyłapie ewentualne błędy składni popełnione z winy użytkownika, np. rozpoczęcie znacznika <REDAKTOR>, gdy jest już on otwarty. Nie pozwala także na uwzględnianie ich reszty (<www>, <ksywa> itp.) poza tagiem <REDAKTOR>, nie narażając nas tym samym na jakieś nieprzewidziane działania. Każdy znacznik, jaki tu zostanie napotkany, zostanie wpisany do zmiennej globalnej $act_tag - dlaczego, wyjaśnię w następnym komentarzu. Dalej będziemy mieli funkcję obróbki tekstu pomiędzy znacznikami (jak zrobić, by rozpoznawał ją parser, napiszę dalej):

   function tag_text($parser, $text){
      global $act_tag, $int, $redakcja, $czy_redaktor;

      if($czy_redaktor == 1){
         switch($act_tag){
            case 'KSYWA': $redakcja[$int] -> nick .= $text; break;
            case 'MAIL': $redakcja[$int] -> mail .= $text; break;
            case 'WWW': $redakcja[$int] -> www .= $text; break;
            case 'PRAWA': $redakcja[$int] -> funkcja .= $text; break;
            case 'OPIS': $redakcja[$int] -> opis .= $text; break;
         }
      }
   }

Funkcje obróbki tekstu między znacznikami pobierać muszą dwa parametry: $parser, czyli zasób parsera, oraz jakiś parametr, w którym będzie uwzględniony przesłany z tegoż parsera tekst. Zauważ, że nie otrzymujemy przy tym informacji, z JAKIEGO znacznika pochodzi wiadomość. I po to przydaje nam się zmienna globalna $act_tag! Dzięki niej określimy, gdzie otrzymane dane należy wpisać.

   Funkcja obsługująca zamykanie tagów jest bardzo prosta: sprawdza tylko, czy należy zamknąć znacznik <REDAKTOR>, a jeśli tak, to wykonuje odpowiednie działania.

   function tag_end($parser, $attr){
      global $act_tag, $int, $czy_redaktor;
      if($attr == 'REDAKTOR' && $czy_redaktor == 1){
         $int++;
         $czy_redaktor = 0;
      }
   }

Tu raczej komentarze są zbędne. Teraz tylko dobrze Ci już znane inicjowanie parsera i ładowanie danych...

   $parser = xml_parser_create();

   xml_set_element_handler($parser, 'tag_start', 'tag_end');
   xml_set_character_data_handler($parser, 'tag_text');

   if(!($fp = fopen('redakcja.xml', 'r'))) {
      die('Nie można otworzyć podanego pliku XML!!!');
   }

   while($data = fread($fp, 4096)) {
      if(!xml_parse($parser, $data, feof($fp))){
         die(sprintf("Błąd XML: %s w linii %d",
               xml_error_string(xml_get_error_code($_parser)),
               xml_get_current_line_number($parser)));
         }
      }
   xml_parser_free($parser);

...ALE widać, że w kodzie odpowiadającym za inicjację interpretera doszła nam jedna funkcja: xml_set_character_data_handler. Dzięki niej informujemy go, że do obsługi danych między znacznikami ma wykorzystywać funkcję "tag_text".

   Teraz pozostało nam już tylko wyświetlenie danych o redaktorach:

   echo '<center>REDAKCJA</center><br>';

   foreach($redakcja as $redaktor){
      echo '<hr>
      <b>Nick</b>: '.$redaktor -> nick.'<br>
      <b>Imię i nazwisko</b>: '.$redaktor -> PobierzPersonalia().'<br>
      <b>Mail</b>: <a href="mailto:'.$redaktor -> mail.'">'.$redaktor -> mail.'</a><br>
      <b>WWW</b>: '.(strlen($redaktor -> www) != 0 ? ('<a href="'.$redaktor -> www.'">'.$redaktor -> www.'</a>') : 'Brak').'<br>
      <b>Funkcja</b>: '.$redaktor -> funkcja.'<br>
      <b>Opis</b>: '.$redaktor -> opis.'<br>
      ';
   }
?>

Zauważ, jaki fajny trick zastosowałem, by wyświetlić "Brak" w przypadku gdy redaktor nie ma strony WWW, lub hiperłącze do niej, gdy takową stronę posiada, bez użycia instrukcji IF. To się tylko tak wydaje, że "bez użycia", bo w rzeczywistości używam jej, lecz w trochę innej postaci. To, co Ci tu zaprezentowałem to specjalna jej odmiana:

warunek ? gdy_prawdziwy : gdy_fałszywy;

Zaletą jest to, że można go właśnie używać w takich sytuacjach.

   Do czego może przydać się XML na twoich stronach? Załóżmy, że piszesz dość duży serwis, lecz chcesz, by newsy z niego mogli zamieszczać także inni. Na pewno nie stworzysz im dodatkowego konta dostępu do bazy - często jest to niemożliwe. Możesz jednak eksportować wszystkie newsy do pliku XML, a życie będzie prostsze - inni napiszą tylko parser i po kłopocie. XML'a można wykorzystać również do opisywania budowy kursów, artykułów, lub czego dusza zapragnie :]. Możliwości jest wiele, zwłaszcza, że PHP wspiera nie tylko takie banalne podstawy tego metajęzyka, jakie przedstawiłem, ale także sprawy takie, jak XSL, czy DOM. "Żyć, nie umierać" :]. Na początek jednak zacznij od: http://www.php.net/manual/pl/ref.xml.php.

   Na tym już kończę ten artykuł. Mam nadzieję, że zachęcił on Was do dalszych eksperymentów z XML'em, gdyż tu przedstawilem tylko podstawy. Jeżeli masz jakieś pytania, zadaj je na forum Webcity, a postaram Ci się pomóc.

Powrót