Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [xml] Sortowanie pliku XML
Forum PHP.pl > Forum > XML, AJAX
atomek4
Witajcie,

Napisałem sobie skrypt w PHP 5 z wykorzystaniem SimpleXML, który pobiera dane z pliku XML o takim mniej więcej układzie:
  1. <slownik>
  2. <definicja>
  3. <tytul></tytuł>
  4. <opis></opis>
  5. </definicja>
  6. </slownik>



Czy jest możliwe wykonanie sortowania pliku XML, w tym przypadku np. po tytule?
Czy muszę po prostu wszystkie dane sam posegregować, przy wprowadzaniu?
SHARKI
nie znam php :/ =[

ale wiem ze to wyswietlania danych sluzy np xsl w którym mozna sortowac dane.

xls czyta dane z xml'a i je wyswietla tak jak ktos sobie rzyczy
atomek4
cześć, tak sortować bardzo wygodnie moge dzieki xsl, ale to wszystko jest po stronie klienta. Zalezalo mi na tym, aby zrobic to po stronie serwera. Funkcje php do xsl i xslt przejrzałem niestety troche tam utknalem a w ostateczności rezultaty mowiac szczerze nie byly zadowalajace. Poza tym pozostawala jeszcze kwestia wyszukiwania tego , co sobie użytkownik zażyczy.
W każdym badź razie przy recznym tworzeniu pliku zadbałem, żeby definicje byly posortowane alfabetyczne. Trzeba bylo sobie jakos poradzic smile.gif
Pozdrawiam
yaotzin
Plik XML jakiś tam:

  1.  
  2.  
  3. <?xml version="1.0" encoding="iso-8859-2" ?>
  4. <?xml-stylesheet type="text/xsl" href="nazw.xsl"?>  
  5. <!DOCTYPE pilkarze [
  6. <!ELEMENT pilkarze (pilkarz*)>
  7. <!ELEMENT pilkarz (imie,nazwisko,data_urodzenia,klub,pozycja,bramek)>
  8. <!ELEMENT imie (#PCDATA)>
  9. <!ELEMENT nazwisko (#PCDATA)>
  10. <!ELEMENT data_urodzenia (#PCDATA)>
  11. <!ELEMENT klub (#PCDATA)>
  12. <!ELEMENT pozycja (#PCDATA)>
  13. <!ELEMENT bramek (#PCDATA)>]>
  14.  
  15. <pilkarze>
  16.      <pilkarz>
  17.            <imie>Roberto</imie>
  18.            <nazwisko>Baggio</nazwisko>
  19.            <data_urodzenia>18.02.1967</data_urodzenia>
  20.            <klub>Brescia</klub>
  21.            <pozycja>napastnik</pozycja>
  22.            <bramek>216</bramek>
  23.      </pilkarz>
  24.      <pilkarz>
  25.            <imie>Roy</imie>
  26.            <nazwisko>Keane</nazwisko>
  27.            <data_urodzenia>10.08.1971</data_urodzenia>
  28.            <klub>Celtic FC</klub>
  29.            <pozycja>napastnik</pozycja>
  30.            <bramek>74</bramek>
  31.      </pilkarz>
  32.      <pilkarz>
  33.            <imie>Luis</imie>
  34.            <nazwisko>Enrigue</nazwisko>
  35.            <data_urodzenia>08.05.1970</data_urodzenia>
  36.            <klub>FC Barcelona</klub>
  37.            <pozycja>Pomocnik</pozycja>
  38.            <bramek>12</bramek>
  39.      </pilkarz>
  40.      <pilkarz>
  41.            <imie>Lilian</imie>
  42.            <nazwisko>Thuram</nazwisko>
  43.            <data_urodzenia>01.01.1972</data_urodzenia>
  44.            <klub>FC Barcelona</klub>
  45.            <pozycja>Obrońca</pozycja>
  46.            <bramek>47</bramek>
  47.      </pilkarz>
  48.      <pilkarz>
  49.            <imie>Michael</imie>
  50.            <nazwisko>Platini</nazwisko>
  51.            <data_urodzenia>21.06.1955</data_urodzenia>
  52.            <klub>Juventus Turyn</klub>
  53.            <pozycja>Ofensywa</pozycja>
  54.            <bramek>60</bramek>
  55.      </pilkarz>
  56.      <pilkarz>
  57.            <imie>Michael</imie>
  58.            <nazwisko>Owen</nazwisko>
  59.            <data_urodzenia>14.12.1979</data_urodzenia>
  60.            <klub>Newcastle United</klub>
  61.            <pozycja>Napastnik</pozycja>
  62.            <bramek>174</bramek>
  63.      </pilkarz>
  64.      <pilkarz>
  65.            <imie>George</imie>
  66.            <nazwisko>Weah</nazwisko>
  67.            <data_urodzenia>01.10.1966</data_urodzenia>
  68.            <klub>Manchester City</klub>
  69.            <pozycja>Napastnik</pozycja>
  70.            <bramek>30</bramek>
  71.      </pilkarz>
  72.      <pilkarz>
  73.            <imie>Dino</imie>
  74.            <nazwisko>Zoff</nazwisko>
  75.            <data_urodzenia>28.02.1942</data_urodzenia>
  76.            <klub>Juventus Turyn</klub>
  77.            <pozycja>Pomocnik</pozycja>
  78.            <bramek>32</bramek>
  79.      </pilkarz>
  80.      <pilkarz>
  81.            <imie>Zinedine</imie>
  82.            <nazwisko>Zidane</nazwisko>
  83.            <data_urodzenia>23.06.1972</data_urodzenia>
  84.            <klub>Real Madryt</klub>
  85.            <pozycja>Napastnik</pozycja>
  86.            <bramek>135</bramek>
  87.      </pilkarz>
  88.      <pilkarz>
  89.            <imie>Rob</imie>
  90.            <nazwisko>Rensenbrink</nazwisko>
  91.            <data_urodzenia>03.07.1947</data_urodzenia>
  92.            <klub>Toulouse FC</klub>
  93.            <pozycja>Lewoskrzydłowy</pozycja>
  94.            <bramek>75</bramek>
  95.      </pilkarz>
  96.      <pilkarz>
  97.            <imie>Andrij</imie>
  98.            <nazwisko>Szewczenko</nazwisko>
  99.            <data_urodzenia>29.09.1976</data_urodzenia>
  100.            <klub>AC Milan</klub>
  101.            <pozycja>Lewoskrzydłowy</pozycja>
  102.            <bramek>190</bramek>
  103.      </pilkarz>
  104.      <pilkarz>
  105.            <imie>Alan</imie>
  106.            <nazwisko>Shearer</nazwisko>
  107.            <data_urodzenia>13.08.1970</data_urodzenia>
  108.            <klub>Southampton F.C.</klub>
  109.            <pozycja>Napastnik</pozycja>
  110.            <bramek>100</bramek>
  111.      </pilkarz>
  112.      <pilkarz>
  113.            <imie>Omar</imie>
  114.            <nazwisko>Sivori</nazwisko>
  115.            <data_urodzenia>02.10.1935</data_urodzenia>
  116.            <klub>Juventus Turyn</klub>
  117.            <pozycja>Napastnik</pozycja>
  118.            <bramek>26</bramek>
  119.      </pilkarz>
  120.      <pilkarz>
  121.            <imie>Nílton</imie>
  122.            <nazwisko>Santos</nazwisko>
  123.            <data_urodzenia>16.05.1927</data_urodzenia>
  124.            <klub>Botafogo Rio de Janeiro</klub>
  125.            <pozycja>Pomocnik</pozycja>
  126.            <bramek>34</bramek>
  127.      </pilkarz>
  128.      <pilkarz>
  129.            <imie>Karl-Heinz</imie>
  130.            <nazwisko>Rummenigge</nazwisko>
  131.            <data_urodzenia>25.09.1955</data_urodzenia>
  132.            <klub>Servette Genewa</klub>
  133.            <pozycja>Napastnik</pozycja>
  134.            <bramek>45</bramek>
  135.      </pilkarz>
  136. </pilkarze>

Kod sortujący w XSL:
  1. <?xml version="1.0" encoding="ISO-8859-2" ?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:output method="html"/>
  4.  
  5. <xsl:template match="/">
  6. <xsl:apply-templates/>
  7. </xsl:template>
  8. <xsl:template match="pilkarze">
  9.      <HTML>
  10.            <HEAD> <TITLE> Pilkarze </TITLE></HEAD>
  11.            <BODY>
  12.                  <div align="center">
  13.                  <table style="border: 1px dashed black;">
  14.                        <tr>
  15.                              <td style="border: 1px solid black; text-align:center;">
  16.                                    <b>Id</b>
  17.                              </td>
  18.                              <td style="border: 1px solid black; text-align:center;">
  19.                                    <b>Imie</b>
  20.                              </td>
  21.                              <td style="border: 1px solid black; text-align:center;">
  22.                                    <b>Nazwisko</b>
  23.                              </td>
  24.                              <td style="border: 1px solid black; text-align:center;">
  25.                                    <b>Data Urodzenia</b>
  26.                              </td>
  27.                              <td style="border: 1px solid black; text-align:center;">
  28.                                    <b>Klub</b>
  29.                              </td>
  30.                              <td style="border: 1px solid black; text-align:center;">
  31.                                    <b>Pozycja</b>
  32.                              </td>
  33.                              <td style="border: 1px solid black; text-align:center;">
  34.                                    <b>Bramki</b>
  35.                              </td>
  36.                        </tr>
  37.                        <xsl:for-each select="//pilkarz">
  38.                        <xsl:sort select="nazwisko" data-type="text" order="ascending"/>
  39.                        <tr>
  40.                              <td style="border-left:1px solid black;
  41.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  42.                                                     padding-right:3px;">
  43.                                    <xsl:number/>
  44.                              </td>
  45.                              <td style="font-size:14pt; color:blue; border-left: 1px solid black;
  46.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  47.                                                     padding-right:3px;font-family:'Times New Roman', Times, serif">
  48.                                    <xsl:value-of select="imie"/>
  49.                              </td>
  50.                              <td style="border-left:1px solid black;
  51.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  52.                                                     padding-right:3px;">
  53.                                    <xsl:value-of select="nazwisko"/>
  54.                              </td>
  55.                              <td style="font-weight: bold; text-align:center; border-left:1px solid black;
  56.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  57.                                                     padding-right:3px;">
  58.                                    <xsl:value-of select="data_urodzenia"/>
  59.                              </td>
  60.                              <td style="border-left:1px solid black;
  61.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  62.                                                     padding-right:3px;">
  63.                                    <xsl:value-of select="klub"/>
  64.                              </td>
  65.                              <td style="border-left:1px solid black;
  66.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  67.                                                     padding-right:3px;">
  68.                                    <xsl:value-of select="pozycja"/>
  69.                              </td>
  70.                              <td style="font-style:italic; font-size:12pt; border-left:1px solid black;
  71.                                                     border-bottom: 1px solid black; border-right: 1px solid black; padding-left:3px;
  72.                                                     padding-right:3px;">
  73.                                    <xsl:value-of select="bramek"/>
  74.                              </td>
  75.                        </tr>
  76.                        </xsl:for-each>                        
  77.                  </table>
  78.                  </div>
  79.                  <HR/>
  80.                        <a href="plik.xml">Wszyscy pilkarze z bazy danych</a><BR/>
  81.                        <a href="urodzeni.xml">Urodzeni w roku 1972</a><BR/>
  82.                        <a href="imie.xml">Imie: Michael</a><BR/>
  83.                        <strong>Sortuj według</strong><BR/>
  84.                        <a href="nazw.xml">Nazwisk</a><BR/>
  85.                        <a href="klub.xml">Klubu</a><BR/>
  86.                        <a href="bramki.xml">Ilości strzelonych bramek</a><BR/>
  87.                  <HR/>
  88.                  Dane Pobrane ze strony:<a href="http://pl.wikipedia.org/wiki/Kategoria:Piłkarze_FIFA_100" title="Szczegółowe informacje">
  89.                  pl.wikipedia.org</a>
  90.            </BODY>
  91.      </HTML>
  92. </xsl:template>
  93.  
  94. </xsl:stylesheet>


Nie dawno całkiem pisałem aplikację dla XML i miałem tam dokładnie ten sam problem co ty musiałem sortować dane, tyle że nie w kolejności alfabetycznej tylko wg dat. użyłem do tego funkcji parsujących XML i jakiejść funkcji do XSLT, z tego co pamiętam funkcja do XSLT mnie mocno zawiodła bo nie zadziałała tak jak sobie tego zażyczyłem tzn. formatowanie się zgadzało, dane były wyświetlane w tabeli w odpowiedni żądany przeze mnie sposób z tym że nie posortowało mi tego wg dat ani wg żadnych innych kryteriów, wkurzyłem się mocno (po długim czasie czytania dokumentacji DOMXML oraz SimpleXML i jeszcze jakiejść tam biggrin.gif). więc poszedłem nieco na około i załadowałem cały plik XML do tablicy asocjacyjnej (przydaje się funkcja
  1. <?php
  2. ?>
) a następnie posortowałem sobie ją wykorzystując funkcję uasort i tyle :] W sumie zastanawiam się co by się stało gdyby plik XML zawierał baaaardzo dużo rekordów, ale ja w moim przypadku nie było to aż tak istotne. PZDR
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.