Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wyciągnięciem danych z XML.
Forum PHP.pl > Forum > XML, AJAX > XML
Ardo
Mam taki mały problem, dla jednych pewnie mały, mam problem z wyciągnięciem danych a dokładniej mówiąc z podpięciem się:

Już wyjaśniam na przykładzie kodu, oto xml:

  1. <lista_ofert>
  2. <dzial tab="domy" typ="sprzedaz" />
  3. <dzial tab="domy" typ="wynajem">
  4. <oferta>
  5. <id>109028</id>
  6. <cena waluta="EUR">2500,0000</cena>
  7. <param nazwa="cena1m" typ="real">37,26</param>
  8. <param nazwa="wojewodztwo" typ="text">Mazowieckie</param>
  9. <param nazwa="miasto" typ="text">Warszawa</param>
  10. ........
  11. <param nazwa="miasto" typ="text">Warszawa</param>
  12. </dzial>
  13. <dzial tab="dzialki" typ="sprzedaz">
  14. <oferta_usun>
  15. <id>137695</id>
  16. </oferta_usun>
  17. </dzial>
  18. <dzial tab="dzialki" typ="wynajem" />
  19. <dzial tab="lokale" typ="sprzedaz" />
  20. <dzial tab="lokale" typ="wynajem">
  21. <oferta>
  22. <id>109028L</id>
  23. <cena waluta="EUR">2500,0000</cena>
  24. <param nazwa="cena1m" typ="real">37,26</param>
  25. <param nazwa="wojewodztwo" typ="text">Mazowieckie</param>
  26. </oferta>
  27. </dzial>
  28. ....


Jak widać drzewko tu jest różne, jak dlamnie nie poukładane.


a to kod który napisałem by to ściągnąć tak wyglada
  1. $product = simplexml_load_file ($hurtownia[0]);
  2.  
  3. foreach ($product->lista_ofert->dzial -> oferta as $oferta )
  4. {
  5.  
  6. $thisDom = array (
  7. 'id' => $oferta->id,
  8. 'cena' => $oferta->cena
  9. ...
  10. );
  11.  
  12. $request[] = $thisDom;
  13.  
  14. }




Moje pytanie jest takie jak widać w XML są <dzial tab="domy" typ="sprzedaz" /> zamknięte które nie mają danych I
otwarte <dzial tab="domy" typ="wynajem"> ….. </dzial> jak można to wyciągnąć te działy tylko otwarte ?

mam nadzieje że jakoś udało mi się opisać sens mojego problemu.

Będę wdzięczny za wszelką pomoc jak i sugestie.
skowron-line
Kod
$path = $xml->xpath('//oferta/..');

Nie wiem czy to zadziała ale ja bym szedł w tą stronę
http://www.w3schools.com/xpath/xpath_syntax.asp
masz tam oferta i oferta_usun, jak uważnie przeczytasz co co jest w tym linku to zobaczysz jak łatwo można połączyć te 2 wątki.
Ardo
Dzieki za pomoc niestety przy funkcji xpath() wyskakuje mi caly czas
Call to a member function xpath() on a non-object

nie bardzo wiem jak to ugryźć




Cytat(skowron-line @ 3.02.2012, 14:57:09 ) *
Kod
$path = $xml->xpath('//oferta/..');

Nie wiem czy to zadziała ale ja bym szedł w tą stronę
http://www.w3schools.com/xpath/xpath_syntax.asp
masz tam oferta i oferta_usun, jak uważnie przeczytasz co co jest w tym linku to zobaczysz jak łatwo można połączyć te 2 wątki.

mortus
Do sprawdzenia, czy dany element posiada pod-elementy możesz użyć metody count():
  1. $oferty = array();
  2. foreach($xml->lista_ofert->dzial as $dzial) {
  3. if($dzial->count() > 0) {
  4. foreach($dzial->oferta as $oferta) {
  5. $oferty[] = $oferta;
  6. }
  7. }
  8. }
  9. echo '<pre>';
  10. print_r($oferty);

Podobnie w przypadku parametrów. Żeby wyodrębnić parametry, w pętli, w której masz $oferty[] = $oferta musi się znaleźć kolejna pętla.
Ardo
Dziekuje za pomoc i cierpliwosc, wykożystałem ten linijki kodu dostaje taka informacje: liczenie nie dziala

Call to undefined method SimpleXMLElement::count()



Cytat(mortus @ 3.02.2012, 21:24:37 ) *
Do sprawdzenia, czy dany element posiada pod-elementy możesz użyć metody count():
  1. $oferty = array();
  2. foreach($xml->lista_ofert->dzial as $dzial) {
  3. if($dzial->count() > 0) {
  4. foreach($dzial->oferta as $oferta) {
  5. $oferty[] = $oferta;
  6. }
  7. }
  8. }
  9. echo '<pre>';
  10. print_r($oferty);

Podobnie w przypadku parametrów. Żeby wyodrębnić parametry, w pętli, w której masz $oferty[] = $oferta musi się znaleźć kolejna pętla.

mortus
W sumie to linie 3 i 7 możesz bez obaw wyrzucić i też powinno działać. A jeśli chodzi o błąd, to zapewne masz starszą wersję PHP niż 5.3.0.
Aby pobrać parametry nadal jest potrzebna jeszcze jedna pętla w tej pętli, tak jak pisałem poprzednio i zliczanie możesz pominąć.
Ardo
dziękuje małymi kroczkami do przodu mam inne pytanie

chciałbym zXML usunąć z opisu <linia>Warszawa Wilanów Dom do wynajmu </linia>
<linia> </linia>

wymyśliłem coś takiego :


  1. $patterns = array(
  2. 0 => '#\<linia\>#',
  3. 1 => '#\<\/linia\>#'
  4. );
  5.  
  6. $replacements = array(
  7. 0 => '',
  8. 1 => ''
  9. );
  10. $zip = $hurtownia[0];
  11. $xml = file_get_contents($zip);
  12. $xml = preg_replace($patterns, $replacements, $xml);
  13. $product = simplexml_load_string($xml);
  14.  


tylko jak mam opisać to w $replacements i $patterns coś nie tak jest bo ogólnie usuwa mi wszytko z linijek <linia></linia>.




Cytat(mortus @ 4.02.2012, 15:29:28 ) *
W sumie to linie 3 i 7 możesz bez obaw wyrzucić i też powinno działać. A jeśli chodzi o błąd, to zapewne masz starszą wersję PHP niż 5.3.0.
Aby pobrać parametry nadal jest potrzebna jeszcze jedna pętla w tej pętli, tak jak pisałem poprzednio i zliczanie możesz pominąć.

skowron-line
Cytat(Ardo @ 3.02.2012, 20:21:56 ) *
Dzieki za pomoc niestety przy funkcji xpath() wyskakuje mi caly czas
Call to a member function xpath() on a non-object

http://www.php.net/manual/pl/simplexmlelement.xpath.php

Pokombinuj z XPATH to nie będziesz miał śmietnika w kodzie w stylu count w pętli, bo Xpath zwróci Ci kolekcję obiektów z określonych w nim kryteriów.
everth
Znając życie to pewnie też SimpleXML wykłada się gdzieś na niedobrze sformatowanym XMLu. Przynajmniej u mnie jest tak w 90% przypadków gdy xpath zwraca dla zapytania 0 mimo że te elementy tam są. Możesz kombinować z DOMDocument i loadHTML + późniejszą konwersją do SimpleXML. Niekiedy pomaga.
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-2024 Invision Power Services, Inc.