Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie treści z pliku .xml
Forum PHP.pl > Forum > PHP
istrd
Witam,
Chcę pobrać dane z xmla lecz mam problemy z wyłuskaniem wszystkich danych. Nie ma problemu jeśli chodzi o tagi <name></name> czy <cat> </car>.
Problemy pojawiają się gdy chce pobrać pole price, avail, <a name="Producent"> ,<a name="Kod_producenta">. Ktoś może mi pomóc to wyłuskać?
kod php
  1. $doc = new DOMDocument('1.0', 'UTF-8');
  2. if($doc->load(APPLICATION_PATH.'/../public/'.$file))
  3. {
  4. echo "Plik zaladowany ". "<Br>";
  5. $title = $doc->getElementsByTagName('name');
  6. $params = $dom->getElementsByTagName('cat');
  7.  
  8. for($i = 0; $i < $title->length; ++$i)
  9. {
  10. echo $title->item($i)->nodeValue ;
  11. echo $params->item($i)->nodeValue ;
  12.  
  13. }
  14. }

Mój Xml
  1. <o id="5" url="jakis url" price="187" avail="1" set="0">
  2. <cat>
  3. <![CDATA[Jakaś tresc ]]>
  4. </cat>
  5. <name>
  6. <![CDATA[tytul]]>
  7. </name>
  8. <imgs>
  9. <main url="obrazek.jpg" />
  10. </imgs>
  11. <desc>
  12. Opis
  13. </desc>
  14. <attrs>
  15. <a name="Producent">
  16. <![CDATA[Jakis producent]]>
  17. </a>
  18. <a name="Kod_producenta">
  19. <![CDATA[9]]>
  20. </a>
  21. <a name="EAN">
  22. <![CDATA[]]>
  23. </a>
  24. </attrs>
  25. </o>
CuteOne
http://www.php.net/manual/pl/class.domelement.php#85724 zobacz w jaki sposób pobierane są atrybuty
istrd
Cytat(CuteOne @ 17.07.2012, 18:53:59 ) *
http://www.php.net/manual/pl/class.domelement.php#85724 zobacz w jaki sposób pobierane są atrybuty


Czytałem o tym w manualu, ale jakoś nie dałem rady tego ogarnąć. Jak by ktoś podał mi na moim przykładzie chociaż trochę to dalej bym dał radę.


Zostało mi pobrać kod_produktu i Producenta. Pomoże ktoś? bo już nie wiem co wymyślić.

Aktualny kod PHP kodu xml nie będę powtórnie zamieszczał.

  1. $xmlDoc = new DOMDocument();
  2. $xmlDoc->load(APPLICATION_PATH.'/../public/'.$file);
  3.  
  4. $searchNode = $xmlDoc->getElementsByTagName( "o" );
  5. $title = $xmlDoc->getElementsByTagName('name');
  6. $cat = $xmlDoc->getElementsByTagName('cat');
  7.  
  8. foreach( $searchNode as $searchNode )
  9. {
  10. $price = $searchNode->getAttribute('price');
  11. $avail = $searchNode->getAttribute('avail');
  12.  
  13.  
  14. echo "name". $title->item($i)->nodeValue ."Prajs:".$price." Avail ".$avail."cat : ".$cat->item($i)->nodeValue."<Br>";
  15. $i++;
  16.  
  17. }
Crozin
1. Nazwę i kategorię powinieneś pobierać dopiero wewnątrz pętli - w tej chwili masz to rozwiązane w sposób bardzo, ale to bardzo podatny na błędy.
2. Żeby pobrać producenta i numer EAN musisz w pętli wydobyć wszystkie elementy z <attrs /> i przypisać je sobie do jakieś pomocniczej tablicy, gdzie kluczem będzie wartość atrybutu <a name />, a wartością zawartość element <a />.
istrd
Cytat(Crozin @ 17.07.2012, 23:39:52 ) *
1. Nazwę i kategorię powinieneś pobierać dopiero wewnątrz pętli - w tej chwili masz to rozwiązane w sposób bardzo, ale to bardzo podatny na błędy.
2. Żeby pobrać producenta i numer EAN musisz w pętli wydobyć wszystkie elementy z <attrs /> i przypisać je sobie do jakieś pomocniczej tablicy, gdzie kluczem będzie wartość atrybutu <a name />, a wartością zawartość element <a />.


Podatność na błędy polega tutaj na tym, że czegoś nie ma? Jeśli tak jest to mało istotne.
Punktu drugiego nie czaje więc jeśli możesz mi pomóc w zaimplementowaniu tego co mówisz był bym niezmiernie wdzięczny.
Crozin
Cytat
Podatność na błędy polega tutaj na tym, że czegoś nie ma? Jeśli tak jest to mało istotne.
Błąd polega na tym, że tworzysz trzy zupełnie odrębne kolekcje elementów <o />, <name /> oraz <cat /> i zakładasz że:
1) W każdej występuje tyle samo elementów. A co w przypadku gdyby element <name /> występował zarówno wewnątrz <o /> jak i wewnątrz <cat />?
2) Znalezione elementy będą dostępne w takiej kolejności w jakiej występują w dokumencie - w dokumentacji dla DOM nigdzie nie widzę takiej gwarancji.

W dodatku takie rozwiązanie jest dosyć nieczytelne. Powinieneś pobierać nazwę/kategorię wewnątrz pętli, gdzie masz operujesz już w kontekście konkretnej oferty, a nie całego dokumentu.
Cytat
Punktu drugiego nie czaje więc jeśli możesz mi pomóc w zaimplementowaniu tego co mówisz był bym niezmiernie wdzięczny.
Nie powinienem podawać gotowców, ale tutaj kod będzie krótszy niż tłumaczenie i w dodatku pewnie lepiej zobrazuje całość.
  1. <?php
  2.  
  3. foreach ($document->getElementsByTagName("o") as $offer) {
  4. $name = $offer->getElementsByTagName("name")->get(0)->nodeValue;
  5. $category = ...;
  6.  
  7. $attributes = array();
  8. foreach ($offer->getElementByTagName("attrs")->get(0)->getElementsByTagName("a") as $attribute) {
  9. $attributeName = $attribute->getAttribute("name");
  10. $attributeValue = $attribute->nodeValue;
  11.  
  12. $attributes[$attributeName] = $attributeValue;
  13. }
  14. }
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.