Search code examples
phpxmlsimplexml

Get specific tags from XML


I have a little problem.

I load a XML file using $xml = simplexml_load_file($path);, and after that I display it using print_r($xml);.

As a result I get this:

    SimpleXMLElement Object
(    
    [trk] => SimpleXMLElement Object
        (
            [name] => GraphHopper Track
            [trkseg] => SimpleXMLElement Object
                (
                    [trkpt] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [lat] => 44.847241
                                            [lon] => 20.46966
                                        )

                                    [ele] => 69.6
                                    [time] => 2017-09-08T09:42:44Z
                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [lat] => 44.847439
                                            [lon] => 20.46906
                                        )

                                    [ele] => 69.6
                                    [time] => 2017-09-08T09:42:56Z
                                )

                        )

                )

        )

)

How can I extract [lat], [lon] and [time] tags from XML using a foreach loop in PHP?

Actual XML file:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?><gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="Graphhopper version 0.10" version="1.1" xmlns:gh="https://graphhopper.com/public/schema/gpx/1.1">
<metadata><copyright author="OpenStreetMap contributors"/><link href="http://graphhopper.com"><text>GraphHopper GPX</text></link><time>2017-09-08T09:42:44Z</time></metadata>
<trk><name>GraphHopper Track</name><trkseg>
<trkpt lat="44.847241" lon="20.46966"><ele>69.6</ele><time>2017-09-08T09:42:44Z</time></trkpt>
<trkpt lat="44.847439" lon="20.46906"><ele>69.6</ele><time>2017-09-08T09:42:56Z</time></trkpt>
</trkseg>
</trk>
</gpx>

Solution

  • Per your XML structure this should do it:

    foreach($sxml->trk->trkseg->trkpt as $data) {
        echo $data['lat'] .  PHP_EOL . $data['lon'] . PHP_EOL . $data->time . PHP_EOL;
    }
    

    enter each level with ->. The lat and lon are attributes so use the []s there.

    Demo: https://3v4l.org/oNLSg