Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ XML _ XML parsowanie simplexml

Napisany przez: bdhpl 28.10.2020, 12:48:19

Mam taki xml:

  1. <o id="329">
  2. <cat>
  3. Biuro i firma/Biuro/Meble biurowe/Biurka
  4. </cat>
  5. <name> BIURKO JAY OLCHA </name>
  6.  
  7. <attrs>
  8. <a name="Producent">producent</a>
  9. <a name="Kod_producenta">kod</a>
  10. </attrs>
  11. </o>



i taki php
  1. foreach($xml->children() as $child) {
  2.  
  3. // $role = $child->attributes();
  4.  
  5. foreach($child as $key) {
  6.  
  7.  
  8.  
  9. http://www.php.net/echo $key['id'];
  10. http://www.php.net/echo "<br>";
  11. http://www.php.net/echo $key->cat;
  12. http://www.php.net/echo "<br>";
  13. http://www.php.net/echo $key->name;
  14. http://www.php.net/echo "<br>";
  15. http://www.php.net/echo $key['weight'];
  16. http://www.php.net/echo "<br>";
  17. //
  18. foreach($key->imgs->children() as $imgs)
  19. {
  20. http://www.php.net/echo $imgs['url'];
  21. http://www.php.net/echo "<br>";
  22. }
  23. foreach($key->attrs->attributes() as $attrs)
  24. {
  25. http://www.php.net/echo $attrs->a;
  26. http://www.php.net/echo "<br>";
  27.  
  28.  
  29. }
  30.  
  31. }
  32. }


Jak wyciągnąc wartość producent

Napisany przez: kreatiff 28.10.2020, 13:37:59

Nie wiem co z tą pętlą (wygląda mi jakoś dziwnie, dużo odwołań do nieistniejących węzłów, brak sprawdzania, czy dany węzeł ma dzieci czy nie, tylko od razu foreach), ale by dobrać się do tego, co chcesz, to wystarczy:

  1. http://www.php.net/echo $child->attrs[0]->a[0];

Albo skorzystać z xpath, gdy kolejność węzłów może nie być zawsze taka sama:
  1. http://www.php.net/echo (string)$child->xpath("attrs/a[@name = 'Producent']")[0];

Napisany przez: kreatiff 28.10.2020, 14:29:26

Co to znaczy nie działa?
Kod PHP, który wkleiłeś jest niekompletny. Założyłem, że już ładujesz ten plik do obiektu klasy SimpleXMLElement (na to wskazuje metoda children() oraz attributes() wykorzystane w pętli).
Napisz konkretnie co interesuje Ciebie z tego pliku (jakie dane chcesz sobie wydrukować na ekranie), bo pętla wskazuje, że wszystko, a pytasz tylko o producenta.
Chodzi o wyświetlenie tylko nazwy producenta dla konkretnego id?

PS usuń link do pliku, bo ci go wyszukiwarki zaindeksują niepotrzebnie.

Napisany przez: bdhpl 28.10.2020, 17:34:29

  1. $xml = simplexml_load_file("plik.xml");
  2.  
  3.  
  4.  
  5. foreach($xml->children() as $child) {
  6.  
  7.  
  8.  
  9. http://www.php.net/echo (string)$child->xpath("group/attrs/a[@name = 'Producent']")[0];
  10. http://www.php.net/echo $child->attrs[0]->a[0];
  11.  
  12.  
  13. // $role = $child->attributes();
  14.  
  15. foreach($child as $key) {
  16.  
  17.  
  18.  
  19. http://www.php.net/echo $key['id'];
  20. http://www.php.net/echo "<br>";
  21. http://www.php.net/echo $key->cat;
  22. http://www.php.net/echo "<br>";
  23. http://www.php.net/echo $key->name;
  24. http://www.php.net/echo "<br>";
  25. http://www.php.net/echo $key['weight'];
  26. http://www.php.net/echo "<br>";
  27. //
  28. foreach($key->imgs->children() as $imgs)
  29. {
  30. http://www.php.net/echo $imgs['url'];
  31. http://www.php.net/echo "<br>";
  32. }
  33.  
  34.  
  35. }
  36. }


Tak wyglada całość

Chciałbym tak naprawde wszystko z tego wyciągnać,
Najbardziej interesuje mnie z tych atrybutów EAN jeszcze i kod produktu.

Całość chce załądować do mysqla żeby łatwiej mi sie to obrabiało

Napisany przez: kreatiff 28.10.2020, 21:50:21

No to będzie to bardziej skomplikowana pętla, z której od razu najlepiej przypisywać do zmiennych konkretne elementy i je bindować w zapytaniu do bazy.
Tutaj ogólny zarys tego jak ja to widzę tak na szybko:

  1. $xml = simplexml_load_file("plik.xml");
  2. foreach ($xml->xpath('//o') as $child) {
  3.  
  4. // strybuty elementu <o>
  5. foreach ($child->attributes() as $name => $attribute) {
  6. http://www.php.net/echo "$name: $attribute<br>";
  7. }
  8.  
  9. // kategoria
  10. http://www.php.net/echo 'cat: ' . $child->cat . '<br>';
  11.  
  12. // obrazki
  13. http://www.php.net/echo 'imgs/main: ' . $child->xpath('imgs/main')[0]->attributes()['url'] . '<br>';
  14. foreach ($child->xpath('imgs/i') as $img) {
  15. http://www.php.net/echo 'imgs/i: ' . $img->attributes()['url'] . '<br>';
  16. }
  17.  
  18. // i reszta węzłów analogicznie jak na powyższych przykładach
  19. }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)