Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z wyciągnięciem danych z XML., Problem z wyciągnięciem danych z XML.
Ardo
post 3.02.2012, 14:48:27
Post #1





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 16.03.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
skowron-line
post 3.02.2012, 14:57:09
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
Ardo
post 3.02.2012, 20:21:56
Post #3





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 16.03.2008

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
mortus
post 3.02.2012, 21:24:37
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Ardo
post 3.02.2012, 22:32:45
Post #5





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 16.03.2008

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
mortus
post 4.02.2012, 15:29:28
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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ąć.
Go to the top of the page
+Quote Post
Ardo
post 5.02.2012, 15:57:07
Post #7





Grupa: Zarejestrowani
Postów: 88
Pomógł: 0
Dołączył: 16.03.2008

Ostrzeżenie: (0%)
-----


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ąć.

Go to the top of the page
+Quote Post
skowron-line
post 5.02.2012, 17:08:06
Post #8





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
everth
post 5.02.2012, 21:45:36
Post #9





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

Ostrzeżenie: (0%)
-----


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.


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 02:58