Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Xml-parser-problem
Forum PHP.pl > Forum > PHP
raf2001
Mam taki problem otóż taki oto skrypt
  1. <?
  2.  class logi {
  3.  var $ip, $forwarded, $id, $host, $czas, $url;
  4.  
  5.  // Konstruktor dla PHP4
  6.   function logi ($file) {
  7.    $this->__construct($file);
  8.   }
  9.  
  10.   function __construct($file){
  11.   $xml=simplexml_load_file($file);
  12.   $logi['ip']=$xml->ip;
  13.   $logi['forwarded']=$xml->forwarded;
  14.   $logi['id']=$xml->id;
  15.   $logi['host']=$xml->host;
  16.   $logi['czas']=$xml->czas;
  17.   $logi['url']=$xml->url;
  18.   }
  19.  
  20.   function view() {
  21.    foreach($xml as $logi){
  22.    //   echo '<b>IP</b>: '.$logi->ip . '(' . (strlen($logi->forwarded) !=0 ? ($logi->forwarded) : 'Brak danych' .')<br>';
  23.       echo '<b>Id Usera</b>:'.$logi['ip'].'<br>';
  24.       echo '<b>Host</b>: '. $logi['host'] .'<br>';
  25.       echo '<b>Czas</b>: '.$logi['czas'].'<br>';
  26.       echo '<b>url</b>: '.$logi['url'].'<br>';
  27.    }
  28.   }
  29.  }
  30.   $klasa = new logi('./log/20050217.xml');
  31.   $klasa->view();
  32. ?>
Lecz niedziała czemu? kto mi powie

plik xml ma wygląd
  1. <?xml version="1.0" standalone="yes" ?>
  2. <Logi><dane>
  3.        <ip>127.0.0.1</ip>
  4.        <forwarded></forwarded>
  5.        <id>0</id>
  6.        <czas>localhost</czas>
  7.        <time>17-02-2005 23:11:00</time>
  8.        <url>/r/cms/modules/log_mod-/log.php</url></dane>
  9. </Logi>
bela
Bo zle odwołujesz sie do pol klasowych ?
Sprobuj $logi->ip etc
raf2001
a czy może ktoś mi powie jakzrobić aby mozna było zapisywać i odczytywać pod php4 iphp5, próbowałem takiego kodu lecz na parserze sie nieznam wiec niewiem czy to jest dobre
  1. <?php
  2.    class logi {
  3.    function tag_start($parser, $attr, $params){
  4.       global $act_tag, $int, $logi, $czy_dane;
  5.       if($attr == 'dane' && $czy_dane == 1){
  6.          die('Błąd: Niedozwolone zagnieżdżenie danych!<br>');
  7.       } elseif($attr == 'dane' && $czy_dane == 0){
  8.          $logi[$int] = new logi($params['ID']);
  9.          $czy_dane = 1;
  10.       }
  11.    }
  12.    function tag_text($parser, $text){
  13.       global $act_tag, $int, $logi, $czy_dane;
  14.  
  15.       if($czy_dane == 1){
  16.          switch($act_tag){
  17.             case 'ip': $logi[$int] -> ip .= $text; break;
  18.             case 'forwarded': $logi[$int] -> forwarded .= $text; break;
  19.             case 'id': $logi[$int] -> id .= $text; break;
  20.             case 'host': $logi[$int] -> host .= $text; break;
  21.             case 'time': $logi[$int] -> czas .= $text; break;
  22.             case 'url': $logi[$int] -> url .= $text; break;
  23.          }
  24.       }
  25.    }
  26.    function tag_end($parser, $attr){
  27.       global $act_tag, $int, $czy_redaktor;
  28.       if($attr == 'dane' && $czy_dane == 1){
  29.          $int++;
  30.          $czy_dane = 0;
  31.       }
  32.    }
  33.    }
  34.    $parser = xml_parser_create();
  35.    xml_set_element_handler($parser, 'tag_start', 'tag_end');
  36.    xml_set_character_data_handler($parser, 'tag_text');
  37.  
  38.    if(!($fp = fopen('./log/20050217.xml', 'r'))) {
  39.       die('Nie można otworzyć podanego pliku XML!!!');
  40.    }
  41.  
  42.    while($data = fread($fp, 4096)) {
  43.       if(!xml_parse($parser, $data, feof($fp))){
  44.          die(sprintf(&#092;"Błąd XML: %s w linii %d\",
  45.                xml_error_string(xml_get_error_code($_parser)),
  46.                xml_get_current_line_number($parser)));
  47.          }
  48.       }
  49.    xml_parser_free($parser);
  50.    
  51.    echo '<center>LOGI SYSTEMU Z DNIA:</center><br>' . $dzien;
  52.  
  53.    foreach($logi as $dane){
  54.       echo '<hr>
  55.       <b>IP</b>: '.$logi -> ip . '(' . (strlen($logi -> forwarded) !=0 ? ($logi -> forwarded) : 'Brak danych' .')<br>
  56.       <b>Id Usera</b>:'.$logi -> id.'<br>
  57.       <b>Host</b>: '. $logi -> host .'<br>
  58.       <b>Czas</b>: '.$logi -> czas.'<br>
  59.       <b>url</b>: '.$logi -> url.'<br>';
  60.    }
  61. ?>

Pozatym niewiem jak go używac przerobiłem go z arta z www.webcity.pl
pozatym do zapisywania używam
  1. <?
  2. // system logów użytkownika
  3. $log_dir = 'log';
  4. $data_pliku = date('Ymd');
  5.  
  6. // zbieranie danych o użytowniku
  7. $string = '<dane>
  8. <ip>%remote_ip%</ip>
  9. <forwarded>%forwarded_for%</forwarded>
  10. <id>%user%</id>
  11. <host>%host%</host>
  12. <czas>%time%</czas>
  13. <url>%url%</url></dane>
  14. </Logi>';
  15. // z konfiguracji odczytanie formatu zapisu logu
  16. $string = str_replace('%remote_ip%', getenv('REMOTE_ADDR'), $string);
  17. $string = str_replace('%host%', gethostbyaddr(getenv('REMOTE_ADDR')), $string);
  18. $string = str_replace('%forwarded_for%', getenv('HTTP_X_FORWARDED_FOR'), $string);
  19. $string = str_replace('%time%', date('d-m-Y H:i:s'), $string);
  20. $string = str_replace('%url%', getenv('REQUEST_URI'), $string);
  21. $string = str_replace('%user%', (isset($_SESSION['uid']) ? $_SESSION['uid'] : 0), $string); // te linie możesz usunąć - obowiązuje jedynie w projekcie Coyote
  22.  
  23. // proba otwarcie pliku lub - w przypadku gdy zrodlowy nie istnieje - utworzenia go
  24.  if (!@file_exists($log_dir . '/' . $data_pliku . '.xml')) {
  25.  $file = @fopen($log_dir . '/' . $data_pliku . '.xml', 'w+');
  26.  $begin = '<?xml version=\"1.0\" standalone=\"yes\" ?>' . \"n<Logi>\";
  27.  $string = $begin . $string;
  28.  } else {
  29.  $file = @fopen($log_dir . '/' . $data_pliku . '.xml', 'a+');
  30.  }
  31. @flock($file, 2); // blokowanie pliku - wylacznosc na zapis i odczyt
  32. @fwrite($file, $string);  // zapisanie linii
  33. @flock($file, 3); // odblokowanie pliku
  34. @fclose($file);
  35. ?>

lecz niewiem jak przesunac wskaźnik 7 znaków przed końcem pliku aby można było zapisać wewnątrz taga <logi>
dr_bonzo
Przesuwanie wskaznika pliku: Manual > Filesystem functions, chyba seek() czy jakos tak.
Zainteresuj sie rozszerzeniem DOM [XML] do budowy XMLow.
Vengeance
  1. <?php
  2.    $xml = simplexml_load_file('./log/20050217.xml');
  3.    $conf = new Config($xml);
  4.    
  5.    class Logs
  6.    {
  7.       private $conf;
  8.  
  9.       function __construct(Config $conf)
  10.       {
  11.          $this->conf = $conf;
  12.       }
  13.  
  14.       function view() 
  15.       {
  16.          foreach($xml as $logi)
  17.          {
  18.             echo '<b>Id Usera</b>:'.$this->conf->getParam('/id').'<br>';
  19.             echo '<b>Host</b>: '. $this->conf->getParam('/host') .'<br>';
  20.             echo '<b>Czas</b>: '.$this->conf->getParam('/czas').'<br>';
  21.             echo '<b>url</b>: '.$this->conf->getParam('/url').'<br>';
  22.          }
  23.       }
  24.    }
  25.    class Config
  26.    {
  27.       private $xmlObject;
  28.       
  29.       public function __construct(SimpleXMLElement $xmlObject)
  30.       {
  31.          $this->xmlObject = $xmlObject;   
  32.       }
  33.  
  34.       public function getParam($paramDir)
  35.       {
  36.          $param = $this->xmlObject->xpath('/logi/dane'.$paramDir);   
  37.          if(is_string($ret = (string)$param[0]))
  38.             return $ret;
  39.          else
  40.             return null;
  41.       }
  42.    }
  43. ?>


Chyba zadziala... chyba ;]
pozatym masz bledy w swoim pliku XML. Nazdy pol i ich wartosci ci sie poprzestawialy ;p np. 'czas'
raf2001
tam zamiast czas powinien być host. Dzieki sprawdze w domciu ten skrypcik co dałeś Vengeance, ale ten przykład będzie działał jedynie z obsługą simplexml, a chciałbym także używac php4 bez niej. A tak ps to jest gdzieś polski art o domxml
Vengeance
mowisz ze bys chcial a w swoim kodzie nawet masz
"$xml=simplexml_load_file($file);"

Po 2. Kto ci broni miec na php4 SimpleXML snitch.gif
raf2001
zrobiłem taki kodzik
  1. <?php
  2.  // Utworz nowy dokument DOM
  3.  $doc = domxml_new_doc('1.0');
  4.  // Utwórz element (węzeł) Logi
  5.  $logi = $doc->create_element('Logi');
  6.  $logi = $doc->append_child($logi);
  7.  // utwórz element/wezel dla kazdego rekordu
  8. $occ = $doc->create_element('dane');
  9. $occ = $root->append_child($occ);
  10.  // Dodaj węzeł potomny dla każdego z elementów
  11. // foreach ($row as $fieldname => $fieldvalue) { ($occ);
  12.  $child = $doc->create_element('ip');
  13.  $child = $occ->append_child($child);
  14.  $value = $doc->create_text_node('jakies ip');
  15.  $value = $child->append_child($value);
  16.  //  }
  17.  // Pobierz gotowy dokument XML
  18.  $xml_string = $doc->dump_mem(true);
  19.  echo $xml_string;
  20. ?>

lecz php5 niezna funkcji domxml_new_doc ani dom_new_doc
a Vengeance
twój kodzik niedziała i niewiem czemu. Pomóżcie, niewiem co mam zrobić a potrzebne mi jest porządne parsowanie xml'a
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.