Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML + PHP] Wyciąganie wszystkiego z pliku XML na stronę (edit//PRAWIE DZIAŁA)
Forum PHP.pl > Forum > XML, AJAX > XML
roobik
Witam!

Uczę się dopiero XML, a chcę (ok, muszę!) się nauczyć go do momentu rozpoczęcia roku akad. sad.gif

Plik XML wygląda tak (oczywiście wycinek):
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <wyklady date="20081006060001 +0100">
  3. <dzial id="1_Immunologia">
  4. <nazwa-dzialu>Immunologia</nazwa-dzialu>
  5. </dzial>
  6. -<nazwa wyklad="1_Immunologia" poczatek="20081006073000 +0100" koniec="20081006090000 +0100">
  7. <tytul>Budowa , funkcje i komórki układu  immunologicznego</tytul>
  8. <opis>Tematy poruszane podczas seminarium:
  9. Układ limfatyczny
  10. Funkcje i znaczenie układu odpornościowego
  11. </opis>
  12. </nazwa>
  13.  
  14. .
  15. .
  16. .
  17. </wyklady>

Plik php zaś:
  1. <?php
  2. $wyk = simplexml_load_file('wyklady.xml');
  3.  
  4. $d->nazwa[0];
  5. $d->tytul[0];
  6. $d->opis[0];
  7.  
  8. $w = $wyk->attributes();
  9. echo 'Nazwa1: ';
  10. echo $w->nazwa;
  11. echo 'Nazwa2: ';
  12. echo $w['wyklad'];
  13. echo 'Początek:';
  14. echo $w['poczatek'];
  15. echo 'Koniec:';
  16. echo $w['koniec'];
  17. echo 'Tytuł: ';
  18. echo $w['tytul'];
  19. echo 'Opis: ';
  20. echo $w['opis'];
  21. echo $w->getName();
  22. ?>

Wywala mi błędy:
Cytat
(...)Input is not proper UTF-8, indicate encoding(...)
(...)simplexml_load_file() [function.simplexml-load-file]: ^ (...)
oraz
Fatal error: Call to a member function attributes() on a non-object in(...)


Jak to ugryźć? Co robię źle?
Pomóżcie proszę... sad.gif
Fantazyn
Witam.
Wydaje mi sie, że masz złe kodowanie tego pliku xml.

Zanim ktoś bardziej doświadczony się odezwie spróbuj:
otworzyć swój plik wyklady.xml otworzyć (np. zwykłym notatnikiem) i zapisać go wyklady.xml, ale upewnij się, że formatowaniem jest ustawione na UTF-* a nie standardowe ANSI.

A jak to nie pomoże to spróbuj zastosować coś takiego:
  1. <?php
  2. if (file_exists('wyklady.xml')) {
  3. $wyk = simplexml_load_file('wyklady.xml');
  4. print_r($wyklady);
  5. } else {
  6. exit('Nie ma pliku?');
  7. }
  8. ?>


... i podaj wynik (tego co wyświetli funkcja print_r).

Powodzenia.
roobik
Dostęp do pliku XML będę miał do momentu rozpoczęcia roku (chyba, że "zapomną" winksmiley.jpg ) - nie mogę więc ingerować w sam plik xml...
Na podstawie jednej ze stron zrobiłem coś takiego:
  1. <?php
  2. class wyklad {
  3.  var $wyklady;
  4.  var $date;
  5.  var $dzial;
  6.  var $id;
  7.  var $nazwa;
  8.  var $tytul;
  9.  var $opis;
  10.  }
  11.  
  12. function wyklad($id) {
  13.  $this -> id = $id;
  14.  $this -> dzial = $dzial;
  15.  }
  16.  
  17. function PobierzDane($id) {
  18. return $this -> dzial.' '.$this -> nazwa;
  19. }
  20.  
  21. $int = 0;
  22. $dane = array();
  23. $czy_dane_ok = 0;
  24.  
  25. function open_tag($parser, $attr, $params){
  26. global $act_tag, $int, $dane, $czy_dane_ok;
  27. if($attr == 'DZIAL' && $czy_dane_ok == 1){
  28.  die('Błąd: Niedozwolone zagnieżdżenie w pliku XML!<br>');
  29. }elseif($attr == 'DZIAL' && $czy_dane_ok == 0){
  30.  $dane[$int] = new dane($params['ID']);
  31.  $czy_dane_ok = 1;
  32. }
  33.  
  34. if($czy_dane_ok == 1){
  35.  if($attr != 'nazwa'){
  36. $act_tag = $attr;
  37.  }else{
  38. $dane[$int] -> tytul = $params['TYTUL'];
  39. $dane[$int] -> opis = $params['opis'];
  40.  }
  41. }
  42.  }
  43.  
  44. function open_text($parser, $text){
  45. global $act_tag, $int, $dane, $czy_dane_ok;
  46.  
  47. if($czy_dane_ok == 1){
  48.  switch($act_tag){
  49. //case 'DATA': $date[$int] -> date .= $text; break;
  50. case 'DZIAL': $dane[$int] -> dzial .= $text; break;
  51. case 'ID': $dane[$int] -> id .= $text; break;
  52. case 'NAZWA': $dane[$int] -> dane .= $text; break;
  53. case 'OPIS': $dane[$int] -> opis .= $text; break;
  54.  }
  55. }
  56.  }
  57.  
  58. function end_tag($parser, $attr){
  59. global $act_tag, $int, $czy_dane_ok;
  60. if($attr == 'DZIAL' && $czy_dane_ok == 1){
  61.  $int++;
  62.  $czy_dane_ok = 0;
  63. }
  64.  }
  65.  
  66. $parser = xml_parser_create();
  67.  
  68.  xml_set_element_handler($parser, 'open_tag', 'end_tag');
  69.  xml_set_character_data_handler($parser, 'open_text');
  70.  
  71.  if(!($fp = fopen('wyklady.xml', 'r'))) {
  72. die('Błąd: Nie można otworzyć pliku XML!');
  73.  }
  74.  
  75. while($data = fread($fp, 4096)) {
  76. if(!xml_parse($parser, $data, feof($fp))){
  77.  die(sprintf("<br>Błąd XML: %s w linii %d",
  78.  xml_error_string(xml_get_error_code($_parser)),
  79.  xml_get_current_line_number($parser)));
  80.  }
  81. }
  82.  xml_parser_free($parser); 
  83.  
  84. echo '<center>WYKŁADY</center><br>';
  85.  
  86.  foreach($dzial as $dane){
  87. echo '<hr>
  88. <b>cos tam dzial</b>: '.$dane -> dzial.'<br>
  89. <b>cos tam nazwa</b>: '.$dane -> PobierzDane().'<br>
  90. <b>ID</b>: '.$dane -> id.'.$dane -> dzial.''<br>
  91. <b>tytul </b>: '.(strlen($dane -> tytul) != 0 ? (''.$dane -> nazwa.''.$dane -> wyklad.'') : 'Brak').'<br>
  92. <b>Opis</b>: '.$dane -> opis.'<br>';
  93.  
  94.  }
  95. ?>


//edit
Błąd leżał w tym, że plik xml był zapisany w formacie iso-8859-2...
OK. Teraz, gdy daję
  1. <?php
  2. print_r($wyklady);
  3. ?>

widzę jest zorganizowana tablica... Ale jak to ugryźć?

//edit2
Na podst listingu z pierwszego posta otrzymałem mniej więcej taką tablicę (oczywiście daję wycinek, a nie całą winksmiley.jpg )
Cytat
dateSimpleXMLElement Object ( [@attributes] => Array ( [date] => 20081006060001 +0100 ) [dzial] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1_Immunologia ) [nazwa-dzialu] => Immunologia ) [nazwa] => SimpleXMLElement Object ( [@attributes] => Array ( [wyklad] => 1_Immunologia [poczatek] => 20081006073000 +0100 [koniec] => 20081006090000 +0100 ) [tytul] => Budowa , funkcje i komórki uk�adu immunologicznego [opis] => Tematy poruszane podczas seminarium: Uk�ad limfatyczny Funkcje i znaczenie uk�adu odporno�ciowego ) )

1. Jak to teraz poukładać w tabelki?
2. W jaki sposób na tej podst można zrobić, by na każdy dział przypadała jedna podstrona? A każy dział "podzielony był dodatkowo na strony wg daty?

Teraz to się dopiero zaczęło biggrin.gif
Fantazyn
Może ułatwi Ci kod znaleziony w manualu (zamienia obiekt na tablice):
Kod
mark
12-Sep-2005 08:06
If the property of an object is empty the array is not created. Here is a version object2array that transfers properly.

<?php
function object2array($object)
{
    $return = NULL;
      
    if(is_array($object))
    {
        foreach($object as $key => $value)
            $return[$key] = object2array($value);
    }
    else
    {
        $var = get_object_vars($object);
          
        if($var)
        {
            foreach($var as $key => $value)
                $return[$key] = ($key && !$value) ? NULL : object2array($value);
        }
        else return $object;
    }

    return $return;
}
?>


Powodzenia : )
roobik
smile.gif Dostosowałem do swoich danych - ok, wyszła mi ładna tablica taka, jak wcześniej... Tylko jak to "ubrać" w tabelę, na przykład:
  1. <?php
  2. echo '
  3. .
  4. .
  5. <tr>
  6. <td>'.$date.'<br>'.$nazwa.'</td>
  7. </tr>
  8. <tr>
  9. <td>'.$tytul.'<br>'.$opis.'</td>
  10. </tr>
  11. .
  12. ';
  13. ?>
Fantazyn
  1. <table width="700" border="1">
  2.  
  3. ...
  4.  
  5. <tr>
  6. <td>Data</td><td><?php echo $date; ?></td>
  7. </tr>
  8. <tr>
  9. <td>Nazwa</td><td><?php echo $nazwa; ?></td>
  10. </tr>
  11. <tr>
  12. <td>Tytuł</td><td><?php echo $tytul; ?></td>
  13. </tr>
  14. <tr>
  15. <td>Opis</td><td><?php echo $opis; ?></td>
  16. </tr>
  17.  
  18. ...
  19.  


Mam nadzieję, że coś takiego Cię zadowoli : P
Pozdrawiam.
roobik
z samym php nie mam problemu... chodzi mi tylko o to, w jaki sposób z tej tablicy:
Cytat
dateSimpleXMLElement Object ( [@attributes] => Array ( [date] => 20081006060001 +0100 ) [dzial] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 1_Immunologia ) [nazwa-dzialu] => Immunologia ) [nazwa] => SimpleXMLElement Object ( [@attributes] => Array ( [wyklad] => 1_Immunologia [poczatek] => 20081006073000 +0100 [koniec] => 20081006090000 +0100 ) [tytul] => Budowa , funkcje i komórki uk�adu immunologicznego [opis] => Tematy poruszane podczas seminarium: Uk�ad limfatyczny Funkcje i znaczenie uk�adu odporno�ciowego ) )

wyciągnąć dane właśnie w postaci zmiennych:
$wyklady $date $dzial $id $nazwa $tytul $opis
A później czy zastosować while czyli foreach, czy może jakąś inną metodę?
Narazie bowiem (bez urazy) mam samą tablicę - chyba, że czegoś nie pojąłem... ale proszę o wyrozumiałość... Uczę się na przykładach z neta - na jednej stronie jest napisane tak, a na drugiej inaczej... Nie ma jakiejś "jednolitości"... sad.gif





Przepraszam, że post pod postem - od ostatniego minęło już nieco (b. dużo) czasu, a po zmianie serwera problem pozostał...
Wracając do tego, co już było:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <wyklady date="20081006060001 +0100">
  3. <dzial id="1_Immunologia">
  4. <nazwa-dzialu>Immunologia</nazwa-dzialu>
  5. </dzial>
  6. <nazwa wyklad="1_Immunologia" poczatek="20081006073000 +0100" koniec="20081006090000 +0100">
  7. <tytul>Budowa , funkcje i komórki układu  immunologicznego</tytul>
  8. <opis>Tematy poruszane podczas seminarium:
  9. Układ limfatyczny
  10. Funkcje i znaczenie układu odpornościowego
  11. </opis>
  12. </nazwa>
  13.  
  14. .
  15. .
  16. .
  17. </wyklady>

Czy byłby ktoś w stanie napisać parser do tego pliku XML?
Bardzo proszę o pomoc...
skowron-line
daj sobie
  1. <?php
  2. $xml = simplexml_load_file( $file );
  3. echo'<pre>';
  4. print_r( $xml );
  5. ?>


Zobacz jakie masz zagłębienie a potem foreach i jedziemy.
Kihol
Skoro chcesz zaciągnąć to do arraya, to polecam zamiast bawić się w simplexml_load_file itp. wykorzystaj funkcję: xml_parse_into_struct. Potem już foreach itp.
roobik
skowron-line - niestety, ale wyskakuje błąd:
Cytat
Warning: simplexml_load_file() [function.simplexml-load-file]: wyklady.xml:7: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xA6 0x77 0x69 0x61 in /home/........

Próbowałem kilku rzeczy z naszego Forum... cały czas to samo sad.gif

Kihol - niekoniecznie "chcę" dać do array'a winksmiley.jpg jeśli byłby jakiś lepszy sposób.... to why not winksmiley.jpg
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.