Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]problem z plikiem xml
Forum PHP.pl > Forum > Przedszkole
sweter
Witam, mam taki plik XML:

Kod
<?xml version="1.0" encoding="utf-8"?>
<notes>
    <note>
        <date id="123">2007-06-24</date>
        <heading>qwerty</heading>
        <body>asd</body>
    </note>
    <note>
        <date id="456">2008-01-04</date>
        <heading>qwerty2</heading>
        <body>asd2</body>
    </note>
</notes>


i taki plik PHP, który zajmuje się przetwarzaniem pliku:

  1.  
  2. $reader = new XMLReader();
  3. $reader->open('oferty3.xml');
  4.  
  5.  
  6. while($reader->read()) {
  7. if($reader->nodeType == XMLReader::ELEMENT){
  8. $name = $reader->name;
  9. }
  10.  
  11. if($reader->nodeType == XMLReader::ELEMENT AND $reader->nodeType=="note"){
  12.   $name = $reader->name;
  13. }
  14.  
  15. if($reader->nodeType == XMLReader::TEXT){
  16. if($name=="date"){
  17. echo "<li>".$name."(".$reader->getAttribute('id').") ".$reader->value."</li>";
  18. }else{
  19. echo "<li>".$name." ".$reader->value."</li>";
  20. }
  21. }
  22.  
  23.  
  24. }
  25.  
  26.  


W wyniku otrzymuję coś takiego:

Cytat
date() 2007-06-24
heading qwerty
body asd
date() 2008-01-04
heading qwerty2
body asd2


Mój problem polega na tym, że w nawiasach za słówkiem "date" nie wyświetla się wartość id z pliku XML.

Co jest źle?

paw-e-l
zrobiłem coś takiego winksmiley.jpg
  1. $reader = new XMLReader();
  2. $reader->open('oferty3.xml');
  3.  
  4. $i = 0; // dodane $i
  5. while($reader->read()) {
  6. if($reader->nodeType == XMLReader::ELEMENT){
  7. $name = $reader->name;
  8. }
  9.  
  10. if($reader->nodeType == XMLReader::ELEMENT AND $reader->nodeType=="note"){
  11. $name = $reader->name;
  12. }
  13. $attributes[$i] = $reader->getAttribute('id'); // dodanie atrybutu do tablicy
  14.  
  15. if($reader->nodeType == XMLReader::TEXT){
  16. if($name=="date"){
  17. echo "<li>".$name."(".$attributes[$i-1].") ".$reader->value."</li>"; // wypisanie atrybutu z poprzedniego tagu
  18. }else{
  19. echo "<li>".$name." ".$reader->value."</li>";
  20. }
  21. }
  22.  
  23. $i++; // inkrementacja
  24. }

http://paw-e-l.net/parser.php

nie znam przyczyny ale rozwiązanie polega na wypisaniu atrybutu pochodzącego z poprzedniego tagu haha.gif
sweter
Wielkie dzięki za szybką odpowiedź.

Trochę dodałem do pliku XML:

Kod
</P><P><?xml version="1.0" encoding="utf-8"?>
      <notes>
          <note>
              <date id="123">2007-06-24</date>
              <heading>qwerty</heading>
              <body>asd</body>
              <hello>
                  <today id="1">
                      <morning>hi</morning>
                      <afternoon>hi</afternoon>
                      <evening>hi</evening>
                  </today>
                  <today id="2">
                      <morning>hi</morning>
                      <afternoon>hi</afternoon>
                      <evening>hi</evening>
                  </today>
              </hello>
          </note>
          <note>
              <date id="456">2008-01-04</date>
              <heading>qwerty2</heading>
              <body>asd2</body>
          </note>
      </notes>
      </P><P>


A plik php wygląda teraz tak:

  1.  
  2. $reader = new XMLReader();
  3. $reader->open('oferty3.xml');
  4.  
  5. $q=0;
  6.  
  7. while($reader->read()) {
  8. if($reader->nodeType == XMLReader::ELEMENT){
  9. $name = $reader->name;
  10. }
  11.  
  12. if($reader->nodeType == XMLReader::ELEMENT AND $reader->nodeType=="note"){
  13. $name = $reader->name;
  14. }
  15.  
  16. $id[$q] = $reader->getAttribute('id');
  17.  
  18. if($reader->nodeType == XMLReader::TEXT){
  19. if($name=="date"){
  20. echo "<li>".$name."(".$id[$q-1].") ".$reader->value."</li>";
  21. }elseif($name=="heading" OR $name=="body"){
  22. echo "<li>".$name." ".$reader->value."</li>";
  23. }elseif($name=="hello"){
  24. echo " - ".$name."(".$id[$q-1].") ".$reader->value."<br />";
  25. }elseif($name=="today"){
  26. echo " - - ".$name."(".$id[$q-1].") ".$reader->value."<br />";
  27. }else{
  28. echo " - - - ".$name." ".$reader->value."<br />";
  29. }
  30. }
  31.  
  32.  
  33. if($reader->nodeType == XMLReader::END_ELEMENT AND $name=="note") {
  34.  
  35. }
  36. $q++;
  37. }
  38.  
  39.  


W wyniku dostaję coś takiego:

Cytat
date(123) 2007-06-24
heading qwerty
body asd
- - - morning hi
- - - afternoon hi
- - - evening hi
- - - morning hi
- - - afternoon hi
- - - evening hi
date(456) 2008-01-04
heading qwerty2
body asd2


mi jednak chodzi coś takiego:

Cytat
date(123) 2007-06-24
heading qwerty
body asd
- hello() hello-text 
- - today(1) today-text 
- - - morning hi
- - - afternoon hi
- - - evening hi
- - - morning hi
- - - afternoon hi
- - - evening hi
date(456) 2008-01-04
heading qwerty2
body asd2


Taki wynik dostaję tylko wtedy, gdy plik XML wygląda tak:

Kod
<?xml version="1.0" encoding="utf-8"?>
      <notes>
          <note>
              <date id="123">2007-06-24</date>
              <heading>qwerty</heading>
              <body>asd</body>
               <hello>             hello-text
                    <today id="1">   today-text
                      <morning>hi</morning>
                      <afternoon>hi</afternoon>
                      <evening>hi</evening>
                  </today>
                  <today id="2">
                      <morning>hi</morning>
                      <afternoon>hi</afternoon>
                      <evening>hi</evening>
                  </today>
              </hello>
          </note>
          <note>
              <date id="456">2008-01-04</date>
              <heading>qwerty2</heading>
              <body>asd2</body>
          </note>
      </notes>
 


Jedyne co zostało dodane do pliku xml to "hello-text" i "today-text". Czemu w wyniku nie wypisuje mi tych linijek, jeżeli usunę "hello-text" i "today-text":

Cytat
- hello() hello-text 
- - today(1) today-text 


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.