Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][MySQL][PHP]Zapisywanie danych z XMLa do bazy
Forum PHP.pl > Forum > Przedszkole
m4573r
Potrzebuję, żeby ktoś mi to wyłożył jak idiocie, bo moje doświadczenie z programowaniem skończyło się na etapie "hello world", a cały dzień dzisiaj czytałem różne przemądre wywody na ten temat i w efekcie rozumiem mniej, niż rozumiałem na początku.

Mam windowsową aplikację (końcówkę kliencką większego systemu), która służy do zarządzania ogłoszeniami oraz stronę internetową, która wyświetla ogłoszenia i pobiera dane tych ogłoszeń z bazy mysql. Aplikacja automatycznie generuje mi zipa, w którym mam XMLa (podobno, cytuję, "w formacie oferty.net" - cokolwiek miałoby to znaczyć) zawierającego róznicowy eksport ogłoszeń oraz zdjęcia, a następnie wrzuca tego zipa przez FTP na serwer.

Przykład mojego XML'a (klamra oferta powtarza się wielokrotnie):
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
  3. <plik>
  4. <header>
  5. <informacje>Eksport automatyczny</informacje>
  6. <agencja>Agencja 1</agencja>
  7. <data>2013-11-06 14:36:39</data>
  8. <wersja>0.4</wersja>
  9. <cel>oferty.net</cel>
  10. <zawartosc_pliku>roznica</zawartosc_pliku>
  11. </header>
  12. <lista_ofert>
  13. <dzial typ="sprzedaz" tab="mieszkania">
  14. <oferta>
  15. <id>735</id>
  16. <cena waluta="PLN">540000.00</cena>
  17. <param nazwa="balkon" typ="bool">true</param>
  18. <param nazwa="powierzchnia_balkonu" typ="bool">11.0</param>
  19. <param nazwa="garaz" typ="bool">true</param>
  20. <param nazwa="internet" typ="bool"/>
  21. <param nazwa="lazienka_wc" typ="text">razem z WC</param>
  22. <param nazwa="powierzchnia_lazienki" typ="text">4.4</param>
  23. <param nazwa="liczbapieter" typ="int">3</param>
  24. <param nazwa="liczbapokoi" typ="int">3</param>
  25. <param nazwa="liczbalazienek" typ="int">1</param>
  26. <param nazwa="ma_domofon" typ="bool">true</param>
  27. <param nazwa="ogrzewanie" typ="text">miejskie</param>
  28. <param nazwa="ma_ogrzewanie" typ="bool">true</param>
  29. <param nazwa="materialbudowy" typ="text">cegła</param>
  30. <param nazwa="pietro" typ="int">2</param>
  31. <param nazwa="rokbudowy" typ="int">2009</param>
  32. <param nazwa="typbudynkumieszk" typ="text">blok</param>
  33. <param nazwa="typkuchni" typ="text">widna</param>
  34. <param nazwa="ulica" typ="text">Chrościckiego</param>
  35. <param nazwa="winda" typ="bool"/>
  36. <param nazwa="typ_podlogi" typ="bool">klepka</param>
  37. <param nazwa="czy_cena_do_negocjacji" typ="bool">true</param>
  38. <param nazwa="powierzchnia" typ="real">70.0</param>
  39. <param nazwa="agent_email" typ="text">krysiazdzisia@strona.pl</param>
  40. <param nazwa="agent_gg" typ="text"/>
  41. <param nazwa="agent_nazwisko" typ="text">Krysia Zdzisia</param>
  42. <param nazwa="agent_skype" typ="text"/>
  43. <param nazwa="agent_tel_biuro" typ="text"/>
  44. <param nazwa="agent_tel_kom" typ="text"/>
  45. <param nazwa="kraj" typ="text">Polska</param>
  46. <param nazwa="wojewodztwo" typ="text">Mazowieckie</param>
  47. <param nazwa="miasto" typ="text">Warszawa</param>
  48. <param nazwa="dzielnica" typ="text"/>
  49. <param nazwa="okolica" typ="text"/>
  50. <location>
  51. <area type="root" level="1">Polska</area>
  52. <area type="province" level="2">Mazowieckie</area>
  53. <area type="city" level="5">Warszawa</area>
  54. </location>
  55. <param nazwa="przetarg" typ="bool"/>
  56. <param nazwa="termin_przetargu" typ="text"/>
  57. <param nazwa="vadium" typ="text"/>
  58. <param nazwa="dataaktualizacji" typ="text">2013-11-06 11:07:40</param>
  59. <param nazwa="bezprowizji" typ="bool">true</param>
  60. <param nazwa="forma_wlasnosci" typ="text">własność</param>
  61. <param nazwa="sprzedane" typ="bool">false</param>
  62. <param nazwa="datawprowadzenia" typ="text">2013-11-06 11:08:33</param>
  63. <param nazwa="opis" typ="text"/>
  64. </oferta>
  65. <dzial typ="wynajem" tab="dzialki">
  66. <oferta_usun>
  67. <id>303</id>
  68. </oferta_usun>
  69. <oferta_usun>
  70. <id>272</id>
  71. </oferta_usun>
  72. <oferta_usun>
  73. <id>274</id>
  74. </oferta_usun>


Napisałem już prosty skrypt (docelowo ma być odpalany harmonogramem), który tworzy nowy katalog, wypakowuje do niego zawartość zipa i usuwa zbędną paczkę.
Teraz muszę jakoś wczytać XML'a i brać z niego porcje danych. Każdą klamrę <oferta> muszę pobrać, przetworzyć i zapisać do bazy. Z każdej klamry <oferta_usun> muszę wyciągnąć id, żeby usunąć rekord z tym id z bazy.

Próbowałem wczytać sobie XMLa poleceniem simplexml_load_file, ale niewiele z tego wyszło, bo nie mam pomysłu, co dalej...

Z góry dzięki za każdą pomoc!

nospor
Cytat
Próbowałem wczytać sobie XMLa poleceniem simplexml_load_file, ale niewiele z tego wyszło, bo nie mam pomysłu, co dalej...
Pobierasz wartosci ktore ci interesuja i robisz z nimi co cchesz.
m4573r
No toś mi podpowiedział... Pobierasz wartości, ale jak, skąd? Kuchnia, gdybym nie miał z tym problemu, to bym gitary nie zawracał.
Wyczytałem, że mam użyć pętelki foreach, ale, k...a, jak? Nie bardzo rozumiem jej działanie, a próby spełzły na niczym.
  1. $xmlfile = $dirname.'/oferty.xml';
  2. echo $xmlfile;
  3. //Sprawdzam ścieżkę, jest ok, więc ładuję pliczek xml
  4. $xml = simplexml_load_file($xmlfile);
  5. foreach ($xml as $cos)
  6. {
  7. //I co ma być tutaj??
  8. echo $cos[0]; // Potraktowane jako elemet tablicy nic nie zwraca.
  9. echo $cos; //Potraktowane jak zwykły string też nic nie zwraca.
  10. }

Próbowałem sprawdzić poleceniem echo, czy dostanę jakieś dane z tego XMLa, ale nie dostaję żadnych danych. Nie dostaję też żadnych błędów - error_reporting(E_ALL) w standardzie.
werdan
Nie echo tylko print_r albo var_dump();

  1. var_dump($cos);


I masz całego XML'a



I styka bez forach'a

  1. $xmlfile = $dirname.'/oferty.xml';
  2. $xml = simplexml_load_file($xmlfile);
  3. var_dump((String)$xml->header->informacje);
m4573r
Cytat(werdan @ 17.11.2013, 19:29:19 ) *
Nie echo tylko print_r albo var_dump();

Dzięki! specool.gif
Wiedziałem, że gdzieś robię durny, podstawowy błąd, dlatego pisałem od razu, żeby tłumaczyć jak idiocie, bo jestem prostym project managerem, a nie programistą smile.gif
Na szybko użyłem print_r($cos); i dostałem dane. Teraz mam od czego zacząć. Muszę jeszcze zrozumieć Twoją konstrukcję
  1. var_dump((String)$xml->header->informacje);

Wracam do manuala po dalsze oświecenie. Nie zamykajcie jeszcze wątku, pewnie zaraz będę spowrotem z kolejnym problemem.
Póki co jestem przeświadczony, że muszę sobie podzielić wsad na porcje, bo niektóre paczki eksportowe zawierają po 1000 i więcej pozycji, jednak jeszcze nie mam pomysłu jak to zrobić. Mam wrażenie, że jak ich będzie za dużo, to wszystko mi się sfajda i będzie problem ze stwierdzeniem, które ogłoszenia przeszły, a które nie. W bazie liczącej kilkadziesiąt tysięcy rekordów ręczne sprawdzanie 1000 losowych pozycji z xml'a to sama przyjemność, szczególnie, że trzeba sprawdzić każdą pozycję.


Coś ostatnio miałem jakiś dziwny problem z forum - ciągle komunikat, że połączenie zresetowane przez serwer... Dziwne, ale najważniejsze, że minęło.

Tego zapisu Werdana ze strzałkami dalej nie rozumiem (a konkretniej samych strzałek).
  1. var_dump((String)$xml->header->informacje)


Zgodnie z przewidywaniami mam kolejny problem. Za pomocą podkradzionej komu innemu funkcji (GPL) zamieniłem sobie tego xml'a w tablicę. Ta tablica jest niestety wielowymiarowa i dość rozbudowana, więc ciężko się po niej poruszać. Chciałem sobie z niej wydzielić mniejsze fragmenty - pojedyncze tablice z działami. Ma ktoś może pomysł, jak to zrobić? Ja znalazłem tylko array_chunk, ale skoro nie znam wielkości tablicy (każdy plik inny), to raczej mi się nie przyda.

Zupełnie oddzielną kwestią jest wyciąganie danych z tej tablicy. Udaje mi się to taką metodą:
  1. print_r($tablica[header][informacje]);

Podejrzewam, że podobnie działa rozwiązanie, które podał Werdan z tymi strzałkami, ale nie udało mi się tego uruchomić. Poproszę o objaśnienie tej składni.
werdan
Mój zapis dotyczy pracy z obiektem, twój z tablicą.

Oba zapisy powinny zwrocic ta sama wartosc.
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.