[PHP/XML] pobieranie danych z pliku

0

Witam.

Nie pracowałem jeszcze nigdy z plikami xml, a problem mam, więc chciałbym się poradzić bardziej doświadczonych kolegów :)

Otóż mam plik xml o takiej strukturze:

<forex>
 <item name="..." date="..." time="..." bid="..." ask="..." change="..." min="..." max="..."/>
 <item .... />
 <item .... />
 (...)
</forex>

Chciałbym teraz pobrać z tego pliku kilka "itemów", a z nich np. datę i czas. Próbowałem pomagać sobie manualem php (http://pl2.php.net/manual/pl/ref.xml.php), ale nie za bardzo mi to wychodzi.

Byłbym wdzięczny za pomoc :)

Pozdrawiam,
Greenek

0

Skorzystaj z SimpleXml, jest bardzo proste.

http://pl2.php.net/manual/pl/ref.simplexml.php

0

Postanowiłem skorzystać z SimpleXML, lecz natrafiłem na kolejny problem. Jako, że serwer ma wyłączoną możliwość korzystania ze zdalnych plików musiałem pobrać plik do stringa i dopiero później go parsować. Wygląda to mniej więcej tak:

$xmlfile = fsockopen('adres/xml.php');
$xmlstr = stream_get_contents($xmlfile);
$xml = simplexml_load_string($xmlstr);

Znalazłem też funkcję simplexml2array, która pobrany xml zwraca w postaci tablicy. Póki plik xml jest na moim serwerze wszystko jest ok, ale gdy próbuję pobierać plik z innego serwera (za pomocą tych linijek powyżej) tablica jest pusta. Co z tym kodem jest nie tak?

0

$xmlfile = fsockopen('adres/xml.php');

jeżeli to nie jest skrót myślowy to to na pewno nie przejdzie, to jest połączenie się z hostem adres/xml.php - raczej takiego nie ma

łączysz się z "adres", drugi parametr podajesz port 80, wysyłasz potem nagłówki (GET itp), pustą linię i dopiero dajesz stream_get_contents (jeszcze wynik trza oczyścić z nagłówków - usunięcie wszystkiego do pierwszej pustej linii)

0

male pytanko, do ktorego (jeszcze) nie ma sensu robic nowego watku (jeszze nie zaczalem roboty ;))

czy to simplexmp bedzie dobre dla duzego pliku xml? co bedzie dobre?

wielkosc pliku to jakies 150mb, po spakowaniu ze 3

0

Nie wiem, jak działa akurat SimpleXML, ale obawiam się, że może próbować ładować cały plik do pamięci. Zdecydowana większość serwerów nie pozwala na tak dużą ilość pamięci zajmowanej przez jeden skrypt (aczkolwiek u siebie na localu przykładowo może się udać, wystarczy odpowiednio ustawić php.ini).

0
Greenek napisał(a)

Witam.

Nie pracowałem jeszcze nigdy z plikami xml, a problem mam, więc chciałbym się poradzić bardziej doświadczonych kolegów :)

Otóż mam plik xml o takiej strukturze:

<forex>
 <item name="..." date="..." time="..." bid="..." ask="..." change="..." min="..." max="..."/>
 <item .... />
 <item .... />
 (...)
</forex>

Chciałbym teraz pobrać z tego pliku kilka "itemów", a z nich np. datę i czas. Próbowałem pomagać sobie manualem php (http://pl2.php.net/manual/pl/ref.xml.php), ale nie za bardzo mi to wychodzi.

Byłbym wdzięczny za pomoc :)

Pozdrawiam,
Greenek

Może funkcją explode(); jezeli chodzi o bezposrednie pobrania danych?

0

No, powodzenia ;)

Znalazłem już fajną funkcję, która zwraca mi xml do tablicy. Wszystko działa.

0

BTW: a jaka to funkcja? :) Może podaj, może się komuś kiedyś przyda

0

@Greenek:
Ale taką "funkcję" daje SimpleXML. Oraz parę innych rzeczy do tego. Rzecz w tym, że problemy mogą się pojawić przy dużych plikach, takich, o jakich pisał Tomkiewicz. W takim przypadku jak coś Ci przetwarza cały plik wrzucając go do tablicy, to na 100% nie uda Ci się to na takim pliku.

0

Niby daje, ale z moim plikiem sam SimpleXML miał jakieś humory. Z tą funkcją wszystko działa bez problemu.

function simplexml2array($xml) {
   if (get_class($xml) == 'SimpleXMLElement') {
       $attributes = $xml->attributes();
       foreach($attributes as $k=>$v) {
           if ($v) $a[$k] = (string) $v;
       }
       $x = $xml;
       $xml = get_object_vars($xml);
   }
   if (is_array($xml)) {
       if (count($xml) == 0) return (string) $x; // for CDATA
       foreach($xml as $key=>$value) {
           $r[$key] = simplexml2array($value);
       }
       if (isset($a)) $r['@'] = $a;    // Attributes
       return $r;
   }
   return (string) $xml;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1