Autor Zpráva
Nailen
Profil
Chtěl bych se naučit zpracování XML feedu. Pár návodů jsem už četl a jednoduché příklady zkoušel. Jak je ale něco složitějšího tak se zaseknu.
Poradil by mi někdo na tomto jednoduchém příkladu jak se přistupuje k následujícím strukturovaným datům?

Mám toto XML:

<channel id="ČT1 HD">
  <display-name lang="cs">ČT1 HD</display-name>
  <icon src="../ct1-hd.png"/>
</channel>

<channel id="ČT2 HD">
  <display-name lang="cs">ČT2 HD</display-name>
  <icon src="../ct2-hd.png"/>
</channel>

<programme start="20210220043000 +0000" stop="20210220050000 +0000" channel="ČT1 HD">
  <title lang="cs">Události v regionech</title>
  <desc lang="cs">Hlavní regionální zpravodajská relace České televize. Souhrn nejdůležitějších událostí v krajích České republiky.</desc>
  <credits>
    <director>František Karvánek</director>
    <actor>Jitka Sluková</actor>
    <actor>Miloš Zeman</actor>
  </credits>
  <date>2007</date>
  <category lang="cs">Publicistický</category>
  <icon src="https://www.o2tv.cz/img/epg/ct1_hd/29154984/profi_cover.jpg"/>
  <country lang="cs">Česká Republika</country>
</programme>

<programme start="20210220052500 +0000" stop="20210220062000 +0000" channel="ČT1 HD">
  <title lang="cs">Polopatě</title>
  <desc lang="cs">Nový moderní hobby magazín Filipa Čapky.</desc>
  <credits>
    <actor>Filip Čapka</actor>
  </credits>
  <date>2013</date>
  <category lang="cs">Publicistický</category>
  <icon src="https://www.o2tv.cz/img/epg/ct1_hd/29162615/profi_cover.jpg"/>
  <country lang="cs">Česká Republika</country>
</programme>

Když provedu tento příkaz:

$xml = simplexml_load_file($url) or die("Can't connect to URL");
?><pre><?php print_r($xml); ?></pre><?php

Tak dostanu toto:

[channel] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [id] => ČT1 HD
                        )

                    [display-name] => ČT1 HD
                    [icon] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [src] => .../ct1-hd.png
                                )

                        )

                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [id] => ČT2 HD
                        )

                    [display-name] => ČT2 HD
                    [icon] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [src] => .../ct2-hd.png
                                )

                        )
        
                )

[programme] => Array
        (
    [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [start] => 20210220043000 +0000
                            [stop] => 20210220050000 +0000
                            [channel] => ČT1 HD
                        )

                    [title] => Události v regionech
                    [desc] => Hlavní regionální zpravodajská relace České televize. Souhrn nejdůležitějších událostí v krajích České republiky.
                    [credits] => SimpleXMLElement Object
                        (
                            [director] => František Karvánek
                            [actor] => Array
                                (
                                    [0] => Jitka Sluková
                                    [1] => Miloš Zeman
                                )

                        )

                    [date] => 2007
                    [category] => Publicistický
                    [icon] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [src] => .../profi_cover.jpg
                                )

                        )

                    [country] => Česká Republika
                )
                
         [3] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [start] => 20210220052500 +0000
                            [stop] => 20210220062000 +0000
                            [channel] => ČT1 HD
                        )

                    [title] => Polopatě
                    [desc] => Nový moderní hobby magazín Filipa Čapky.
                    [credits] => SimpleXMLElement Object
                        (
                            [actor] => Filip Čapka
                        )

                    [date] => 2013
                    [category] => Publicistický
                    [icon] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [src] => ../profi_cover.jpg
                                )

                        )

                    [country] => Česká Republika
                )       
                

Potom když bych ty jednotlivé hodnoty chtěl vypsat třeba pomocí tohoto, tak netuším, jak to správně nadefinovat

foreach ($xml->channel as $channel) {
  printf(...

Chtěl bych například na řádky pod sebe vypsat následující informace:

channel =
icon =
start =
stop =
title =
desc =
director =
actor =
date =

Trochu se ztrácím v těch objektech, polích a podpolích. Podaří se mi vždy vypsat jen část.

Předem díky za vysvětlení
Keeehi
Profil
Zas tak složitý to není.
foreach($xml->programme as $programme) {
    echo "channel = " .$programme->attributes()["channel"]."\n";
    echo "icon = " .($programme->icon->attributes()["src"])."\n";
    echo "start = " .$programme->attributes()["start"]."\n";
    echo "stop = " .$programme->attributes()["stop"]."\n";
    echo "title = " .$programme->title."\n";
    echo "desc = " .$programme->desc."\n";
    echo "director = " .implode(", ", $programme->credits->xpath('director'))."\n";
    echo "actor = " .implode(", ", $programme->credits->xpath('actor'))."\n";
    echo "date = " .$programme->date."\n\n";
}

Důležité je vědět, zda máš v proměnné objekt a nebo pole objektů. A to je vlastně celé. Ano, když člověk nedává pozor tak se v tom dá lehce ztratit. Stačí však použít var_dump() a hned víš na čem jsi. Když máš ten objekt (který reprezentuje jeden uzel/tag) tak k přímým potomkům se dostaneš tak, jako kdyby to byly atributy toho objektu. Potomků toho jména však může být více. Pokud použiješ přístup přes jméno potomka jako atribut objekt, dostaneš pouze prvního takového potomka. Pokud chceš pole všech takových potomků, použiješ metodu xpath. Do ní dáš výraz, podle kterého se v podstromu vyhledává. Ten můj je velmi triviální, protože je to velmi jednoduchá úloha ale může to být mnohem složitější. Je to podobné jako jsou třeba CSS selektory, ale mnohem mocnější. No a nakonec, pokud chceš atributy toho uzlu, dostaneš se k nim jako k asociativnímu poli po zavolání metody attributes().
Nailen
Profil
Keeehi:
velice vám děkuji za malou ukázku, jak správně k datům přistupovat. Moc mi to pomohlo, abych se posunul dále.
Keeehi
Profil
Nailen:
Jsem rád ze ti to pomohlo. Nebyl jsem si jistý zda jsem to popsal dostatečně srozumitelně v takto krátkém textu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0