Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> duży xml
grzegorz_g
post
Post #1





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 26.10.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


xpath jeżeli się nie mylę.
Go to the top of the page
+Quote Post
grush
post
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 21.06.2007

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
jest jakieś szybsze (wydajniejsze) dotarcie do samej kategorii np:Cricket

No skoro jest to tylko fragment, to skorzystaj z XMLReader.
Go to the top of the page
+Quote Post
skowron-line
post
Post #6





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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 )
Go to the top of the page
+Quote Post
grzegorz_g
post
Post #7





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 26.10.2004

Ostrzeżenie: (0%)
-----


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"

Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Aby odwołać się do atrybutów węzła musisz użyć "małpy" (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

EDIT: Tyle, że jest jeszcze inna składnia i właśnie ją znalazłem (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif) Czyli idąc do HomeTeam musisz ten węzeł dorzucić ZA szukaniem kategorii (IMG:style_emoticons/default/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

Ten post edytował thek 28.08.2009, 11:30:15
Go to the top of the page
+Quote Post
grzegorz_g
post
Post #9





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 26.10.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
thek
post
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Edytowałem kod więc zerknij teraz (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
grzegorz_g
post
Post #11





Grupa: Zarejestrowani
Postów: 259
Pomógł: 0
Dołączył: 26.10.2004

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.09.2025 - 18:34