Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: pobieranie rekordów z XML'a, problem z nagłówkiem
Forum PHP.pl > Forum > PHP
raval
Witam,

Napisałem skrypt pobierający rekordy z pliku XML.

  1. $xml = simplexml_load_file('sample.xml');
  2. $xml = $xml->offer[0];
  3.  
  4.  
  5. foreach($xml as $key => $value)
  6. {
  7.  
  8. $dl_xml_offer[$key] = $value;
  9. }
  10.  
  11. ...


Wszystko działa poprawnie, jeżeli plik XML jest pozbawiony nagłówka i stopki

  1. <pasaz:Envelope>
  2. <pasaz:Body>
  3. <loadOffers>
  4.  
  5. ...
  6.  
  7. </loadOffers> </pasaz:Body> </pasaz:Envelope>


Czy mogłbym prosić o ewentualną pomoc jak przypisać w skrypcie PHP w/w nagłowek wraz ze stopka, ponieważ wyczerpały mi się już pomysły..

Poniżej załączam plik xml:

  1. <pasaz:Envelope>
  2. <pasaz:Body>
  3. <loadOffers>
  4.  
  5. <offers>
  6.  
  7. <offer>
  8. <id>35</id>
  9. <name>Goodyear Ultra Grip 7+ 195/65/R15 91 T</name>
  10. <price>289,10</price>
  11. <url>http://www.sklep.pl/id=35</url>
  12. <categoryId>Motoryzacja/Opony/Opony osobowe/Opony osobowe zimowe</categoryId>
  13. <description>Gęste ożebrowanie typu Waffle Blades,</description>
  14. <image>http://www.sklep.tel.pl/jpg=35</image>
  15.  
  16.  
  17. <attributes>
  18.  
  19. <attribute>
  20. <name>Producent</name>
  21. <value>Goodyear</value>
  22. </attribute>
  23.  
  24. <attribute>
  25. <name>SAP</name>
  26. <value>515630</value>
  27. </attribute>
  28.  
  29. <attribute>
  30. <name>EAN</name>
  31. <value>5911234567890</value>
  32. </attribute>
  33.  
  34. </attributes>
  35.  
  36. <availability>1</availability>
  37.  
  38. </offer>
  39.  
  40.  
  41. <offer>
  42.  
  43. <id>36</id>
  44.  
  45. <name> Sena Magnetic 13'' </name>
  46. <price>25,54</price>
  47. <url> <a href="http://www.sklep.pl/id=36" target="_blank">http://www.sklep.pl/id=36</a> </url>
  48. <categoryId> Motoryzacja/Felgi i kołpaki/Kołpaki </categoryId>
  49. <description> Kołpak srebne </description>
  50. <image> <a href="http://www.sklep.tel.pl/jpg=36" target="_blank">http://www.sklep.tel.pl/jpg=36</a> </image>
  51.  
  52. <attributes>
  53.  
  54. <attribute>
  55. <name> Producent </name>
  56. <value> Sena </value>
  57. </attribute>
  58.  
  59. <attribute>
  60. <name> Kod producenta </name>
  61. <value> SEA54SD </value>
  62. </attribute>
  63.  
  64. <attribute> <name> EAN </name>
  65. <value> 5911234567890 </value>
  66. </attribute>
  67.  
  68. </attributes>
  69.  
  70. <availability>1</availability>
  71.  
  72. </offer>
  73. </offers>
  74.  
  75. </loadOffers> </pasaz:Body> </pasaz:Envelope>
wookieb
Zapoznaj się z xpathem którego implementacja również istnieje w simpleXml http://pl.php.net/manual/en/simplexmlelement.xpath.php

Spróbuj pobrać tagi takim zapytaniem xpath
Kod
offer


Szybki kurs xpatha http://www.w3schools.com/xpath/
raval
A nie możnaby pobrać całej zawartości pliku do zmiennej i jakąś funkcją php usunąć nagłówki? Dałoby rade? ;x
wookieb
Możesz ale po po co? Stosowanie wyrażeń regularnych w tym przypadku się sprawdzi ale nie zawsze. Od tego jest własnie XPATH.
raval
Stworzyłem pętle:

  1. foreach($xml->xpath('//offer') as $offer)
  2. {
  3. if($offer->id == 56) {echo $offer->name;}
  4. }


Skrypt wykonuje się poprawnie, ale dalej nie działa gdy plik XML ma w sobie nagłowek. Cóż tym razem źle robie?
wookieb
A usunąłeś
  1. $xml = $xml->offer[0];
?snitch.gif
raval
najbardziej, zotało jedynie przypisanie pliku do zmiennej za pomocą simplexml. Nie mam juz pomysłów, jak to obejść :X
wookieb
U mnie działa

  1. $xml = simplexml_load_string($xml);
  2.  
  3. foreach ($xml->xpath('//offer') as $offer) {
  4. print_r($offer);
  5. }

Pokazuje dokładnie 2 oferty.
przykładowy xml
CODE

<?xml version="1.0" encoding="UTF-8" ?>
<root xmlns:pasaz="cos">
<pasaz:Envelope>
<pasaz:Body>
<loadOffers>

<offers>

<offer>
<id>35</id>
<name>Goodyear Ultra Grip 7+ 195/65/R15 91 T</name>
<price>289,10</price>
<url>http://www.sklep.pl/id=35</url>
<categoryId>Motoryzacja/Opony/Opony osobowe/Opony osobowe zimowe</categoryId>
<description>geste s\osebrowanie typu Waffle Blades,</description>
<image>http://www.sklep.tel.pl/jpg=35</image>


<attributes>

<attribute>
<name>Producent</name>
<value>Goodyear</value>
</attribute>

<attribute>
<name>SAP</name>
<value>515630</value>
</attribute>

<attribute>
<name>EAN</name>
<value>5911234567890</value>
</attribute>

</attributes>

<availability>1</availability>

</offer>


<offer>

<id>36</id>

<name> Sena Magnetic 13\'\' </name>
<price>25,54</price>
<url> http://www.sklep.pl/id=36 </url>
<categoryId> Motoryzacja/Felgi i kodpaki/Kofpaki </categoryId>
<description> Kofpak srebne </description>
<image> http://www.sklep.tel.pl/jpg=36 </image>

<attributes>

<attribute>
<name> Producent </name>
<value> Sena </value>
</attribute>

<attribute>
<name> Kod producenta </name>
<value> SEA54SD </value>
</attribute>

<attribute> <name> EAN </name>
<value> 5911234567890 </value>
</attribute>

</attributes>

<availability>1</availability>

</offer>
</offers>

</loadOffers> </pasaz:Body> </pasaz:Envelope></root>
raval
A co jeśli masz taki nagłówek, też Ci działa?

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE pasaz:Envelope SYSTEM "loadOffers.dtd">
  3. <pasaz:Envelope xmlns:pasaz="http://schemas.xmlsoap.org/soap/envelope/">
  4. <pasaz:Body>
  5. <loadOffers xmlns="urn:ExportB2B">
wookieb
A widzisz. To zmienia postać rzeczy.
Teraz "offer" znajdują się w pewnym namespace. Musisz powiedzieć XPATH-owi w jakim namespace szukasz elementów
  1. // podajesz alias namespace (pasaz_offers) oraz jego wartość (urn:ExportB2B)
  2. $xml->registerXPathNamespace('pasaz_offers', 'urn:ExportB2B');
  3. foreach ($xml->xpath('//pasaz_offers:offer') as $offer) {
  4. print_r($offer);
  5. }
raval
Cud nad wisłą, na to bym szybko nie wpadł, dzięki wielkie za pomoc, masz punkta wink.gif

Pozdrawiam
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.