Protip: Parsowanie treści XML w PHP

Dzisiaj krótki wpis o parsowaniu treści XML, jako przykład weźmiemy kanał RSS naszego portalu. Kilka razy spotkałem się już z problemem wśród ludzi, stawiającym barierę – parsowanie pliku XML. Istnieje bardzo prosty sposób by poradzić sobie z tym w bardzo przyjazny sposób. W języku PHP istnieje zestaw funkcji obsługujących parser XML, mowa tutaj o zestawie klas i funkcji SimpleXML, które w prosty sposób pozwalają konwertować plik/ciąg znaków XML do obiektu PHP.

Co mogę zyskać przez użycie SimpleXML?

Wyobraźmy sobie, że mamy sklep Internetowy, na jakimś popularnym systemie typu Prestashop/OpenCart/Gekosale lub własny, autorski skrypt sklepu (tym lepiej). Otrzymujemy od hurtowni plik z listą produktów, wraz ze stanami magazynowymi, tytułami, opisami produktów, linkami do zdjęć itd. Możemy przenosić te produkty ręcznie, jeden po drugim kopiując wartości z Excela do bazy danych, ale co w przypadku gdy ilość produktów przewyższa nasze możliwości? Czas poświęcony na dodanie 20 000 produktów lepiej poświęcić na długi spacer w lesie lub odpoczynek. Z pomocą przychodzi SimpleXML, które poprzez konwersję pliku XML do obiektu PHP pozwala nam iterować wszystkie produkty i za pomocą odpowiedniej funkcji PHP lub wcześniej omawianych modeli ORM, zapisać wszystkie produkty w bazie danych.

Co ze spójnością danych w przypadku plików XML?

Tutaj nie ma jednego, uniwersalnego rozwiązania. Każda usługa może udostępniać różną strukturę plików XML, kanały RSS, ustawienia aplikacji lub chociażby różne hurtownie, każdy ma inną strukturę ale ten sam schemat, oparty o standard XML.

Modyfikacja skryptu parsującego XML może zająć od kilku minut do kilku godzin w zależności od zaawansowania atrybutów.

Odrobina kodu źródłowego

Parsera produktów hurtowni dla sklepu Internetowego dziś nie będziemy pisać, choć to nie wykluczone w przyszłości. Dzisiaj przedstawię zasadę działania zestawu SimpleXML na podstawie naszego, webmastahowego kanału RSS, które serwuje treści w formacie XML.

Nie będziemy używać tutaj żadnych frameworków bo kod jest uniwersalny dla całego języka PHP.
Stwórzmy sobie jakiś plik np. parser.php i umieśćmy w nim źródło naszej funkcji:

Przyjrzyjmy się teraz strukturze pliku XML (wyciąłem z niego elementy, które nas nie będą interesować aby uprościć zrozumienie jego struktury).

Jak widzimy, głównym węzłem kanału RSS jest <channel> do którego odnosimy się poprzez $xml->channel. Przykładowo jeśli chcielibyśmy wydobyć z XML tytuł bloga, wystarczy posłużyć się składnią: $channel->title, ta sama zasada wlicza się analogicznie do pozostałych elementów węzła.

Niżej w hierarchii węzłów jest <item>, który jest powielony o wartość ilości wszystkich elementów w XML (wpisów w naszym wypadku). W kanale RSS domyślnie prezentowanych jest 10 ostatnich wpisów, tak więc w pliku XML będzie 10 podwęzłów <item>.

Jak poprzednio, do podwęzła odnosimy się poprzez $xml->channel->item lecz z racji, że jest więcej niż 1 element <item> musimy wykonać operacje w pętli.

Analogiczne użycie atrybutów podwęzłów jest zawsze takie same: $item->title lub $item->link. Problem pojawia się gdy mamy przestrzenie nazw oraz prefiksy, ale do tego służy funkcja xpath której argumentem jest cały prefiks wpisany jako string.
Można to zobaczyć w przypadku wyciągania nazwy autora oraz ilości komentarzy.

Komentarze są w atrybucie z prefiksem <slash:comments>2</slash:comments> więc użycie metody xpath wygląda następująco:

W starszych wersjach PHP może być problem z taką składnią, można to napisać również tak:

 

Konkluzja

Omówiony dziś sposób na przetwarzanie danych zawartych w XML z pewnością przydaje się w codziennej pracy programisty. Zastosowań jest tyle ile problemów. Wymienię tutaj kilka najważniejszych zastosowań parsera XML:

  • Parser produktów w sklepie Internetowym (automatyzując taki skrypt, możemy zbudować mechanizm aktualizacji stanów magazynowych z użyciem zaplanowanych zadań cron).
  • Skrypt obsługi różnego rodzaju API między innymi Google Maps, które zwracają dane w XML.
  • Własne widgety na stronie wykorzystujące kanały RSS „Ostatnio na forum” lub „Ostatnio na blogu” itp.
  • Integracja naszej strony z różnego rodzaju usługami zewnętrznymi, otwartymi systemami CMS itp.

W razie pytań lub pomysłów, zachęcam do wzięcia udziału w dyskusji w komentarzach, pod tym wpisem.

Programista, administrator - miłośnik nowych technologii. Jak każdy fachowiec w branży nie oprę się porannej kawie w towarzystwie świeżej prasy. Hobbystycznie fotografuję, psuję, naprawiam, lutuję. Czego nie lubię? Nieskromnych ludzi i brzydkiego kodu.

Send this to a friend

webmastah.weekly
Cotygodniowa porcja linków ze świata WEBDEV BEZ spamu, TYLKO samo mięcho!
Zobacz poprzednie wydania. Dołącz do 2 tysięcy webdeveloperów!
HTML5, CSS3, JS (React, Angular, Ember, Vue), PHP, SQL