Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: duży xml
Forum PHP.pl > Forum > XML, AJAX
grzegorz_g
oto bardzo niewielki fragmanet xml'a, którego musze pobrac i zapisać do bazy.

  1.  
  2. - <Betradar>
  3. - <OO>
  4. <Sport>Baseball</Sport>
  5. <Category />
  6. <Tournament>MLB</Tournament>
  7. <Date>2009-08-27T19:05:00</Date>
  8. <AC>1</AC>
  9. <OddsType>2W</OddsType>
  10. - <OddsData>
  11. <HomeTeam>New York Yankees</HomeTeam>
  12. <AwayTeam>Texas Rangers</AwayTeam>
  13. <HomeOdds>1.40</HomeOdds>
  14. <AwayOdds>2.85</AwayOdds>
  15. </OddsData>
  16. </OO>
  17. - <OO>
  18. <Sport>Baseball</Sport>
  19. <Category />
  20. <Tournament>MLB</Tournament>
  21. <Date>2009-08-27T19:05:00</Date>
  22. <AC>1</AC>
  23. <OddsType>Total</OddsType>
  24. - <OddsData>
  25. <HomeTeam>New York Yankees</HomeTeam>
  26. <AwayTeam>Texas Rangers</AwayTeam>
  27. <Totalscore>9.50</Totalscore>
  28. <OverOdds>1.80</OverOdds>
  29. <UnderOdds>1.90</UnderOdds>
  30. </OddsData>
  31. </OO>
  32. - <OO>
  33. <Sport>Cricket</Sport>
  34. <Category />
  35. <Tournament>One Day Internationals</Tournament>
  36. <Date>2009-08-28T11:15:00</Date>
  37. <AC>1</AC>
  38. <OddsType>2W</OddsType>
  39. - <OddsData>
  40. <HomeTeam>Scotland</HomeTeam>
  41. <AwayTeam>Australia</AwayTeam>
  42. <HomeOdds>10.00</HomeOdds>
  43. <AwayOdds>1.02</AwayOdds>
  44. </OddsData>
  45. </OO>
  46. </Betradar>
  47.  


i teraz by zapisać dane z kategorii sport listuje to wszystko poprzez
  1. $xml = simplexml_load_string($plik_z_xml);
  2. foreach ($xml->OO as $channel ) {
  3.  
  4. if ($channel->Sport=="Cricket") {
  5. [zapis do bazy]
  6. }
  7.  
  8.  
  9. }
  10.  
  11.  


jest jakieś szybsze (wydajniejsze) dotarcie do samej kategorii np:Cricket
czekam na sugestie
skowron-line
xpath jeżeli się nie mylę.
grush
a moze Xpath w simpleXML:

  1.  
  2. <dwml>
  3. <data>
  4. <location>
  5. <location-key>point1</location-key>
  6. <point latitude="37.39" longitude="-122.07"></point>
  7. </location>
  8. </data>
  9. .....
  10. </dwml>
  11.  
  12. XPATH Query to take the latitude in more general way
  13. /dwml/data/location/point/@latitude
  14.  
  15. Where as with simple XML it is just a familiar PHP statement,
  16. $simplexml->data->location->point->attributes()->latitude
  17.  
  18. Anyway still you can use the xpath inside your simplexml code. You can execute xpath queries by calling xpath function from any SimpleXMLEelment. It will return an array of SimpleXMLElement that match your query. So for the above example your XPath query would be something like this,
  19. $simplexml= new SimpleXMLElement($xml);
  20. $lats = $simplexml->xpath('/dwml/data/location/point/@latitude');
  21. echo $lats[0];
  22.  
thek
Także polecam Xpath. Sam używam i jest to nieraz o wiele wygodniejsze w użyciu. Jedynie zapytania w bazie są moim zdaniem wygodniejsze smile.gif
erix
Cytat
jest jakieś szybsze (wydajniejsze) dotarcie do samej kategorii np:Cricket

No skoro jest to tylko fragment, to skorzystaj z XMLReader.
skowron-line
Cytat(grush @ 27.08.2009, 10:05:29 ) *
a moze Xpath w simpleXML:

Obawiam się że chyba nie. Ja wybrałem domxml ze wezględu na podobieństwo nazwa do JS ( może głupie no ale )
grzegorz_g
zainteresowałem się xpath

  1.  
  2. $filename = "plik_z_xml.xml";
  3. $doc = new DOMDocument;
  4. $doc->load($filename);
  5. $xpath = new DOMXPath($doc);
  6.  
  7. $query = 'OO/Sport[. = "Soccer"]';
  8. $entries = $xpath->query($query);
  9.  
  10. foreach ($entries as $elements) {
  11.  
  12. print $elements->nodeValue;
  13.  
  14. }
  15.  


i wszystko pięknie wyrzuca mi elementy "Soccer", tyko teraz nie wiem jak pobrać te inne elementy Tournament, HomeTeam,AwayTeam z tego samego węzła. Chce po prostu by wyświetliło mi HomeTeam z węzła gdzie <Sport> ="Soccer"

thek
Aby odwołać się do atrybutów węzła musisz użyć "małpy" smile.gif
Kod
nazwa_węzła/@nazwa_atrybutu

użycie
Kod
nazwa_węzła/@*
zwróci Ci wszystkie atrybuty tego węzła smile.gif

EDIT: Tyle, że jest jeszcze inna składnia i właśnie ją znalazłem winksmiley.jpg
Kod
nazwa_węzła/attribute::*
gdzie za * możesz wstawić nazwę atrybutu jeśli nie chcesz wszystkich.
Sorki... Nie spojrzałem na układ XML i zasugerowałem, że masz to już wewnątrz węzła jako atrybut, a nie kolejne elementy zagnieżdżone. Wtedy przepychasz się dalej w strukturze smile.gif Czyli idąc do HomeTeam musisz ten węzeł dorzucić ZA szukaniem kategorii smile.gif
A więc wejść do OddsData i tam do HomeTeam.
  1. $query = 'OO/Sport[. = "Soccer"]/OddsData/HomeTeam';

Dlatego XPath jest fajne bo działa jak przechodzenie po gałązkach. Robisz coś i szukasz pasujących do wzorca
grzegorz_g
ale przy mojej strukturze xml'a
ma to zastosowanie? bo jako tako nie mam atrybutów (chyba)

potrzebuje wyciągnąć węzły w których <sport> jest równy "Soccer" i mieć możliwość łatwego dostępu do tych danych
thek
Edytowałem kod więc zerknij teraz smile.gif Zasugerowałem się słownictwem w ostatnim poście nie spojrzawszy na XML. Ale poprawilem to już do Twojej wersji:
  1. $query = 'OO/Sport[. = "Soccer"]/OddsData/HomeTeam';
To Ci wyciągnie HomeTeam z Twojego XML smile.gif
grzegorz_g
kod mam teraz tej postaci:
  1.  
  2. $filename = "plik_z_xml.xml";
  3. $doc = new DOMDocument;
  4. $doc->load($filename);
  5. $xpath = new DOMXPath($doc);
  6.  
  7.  
  8. $query = 'OO/Sport[. = "Soccer"]/OddsData/HomeTeam';
  9.  
  10.  
  11. $entries = $xpath->query($query);
  12.  
  13.  
  14. foreach ($entries as $elements) {
  15. print $elements->nodeValue;
  16. }
  17.  


nie ma bledu ale nic tez nie pokazuje sad.gif
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.