-2

ソース:

php simplexml を使用して XML からデータを表示する

SimpleXML を使用して属性と値を取得する

PHP SimpleXML + 属性の取得

PHP 用の simpleXML を使用しようとしていますが、うまく動作しません。

私のxmlサンプル

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <gpx creator="Ski Tracks 1.3.3" version="1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
    <metadata>
    <link href="http://www.corecoders.com">
    <text>Core Coders Ltd</text>
    </link>
    <time>2012-11-15T13:52:46.005+01:00</time>
    <bounds maxlat="52.0502500" maxlon="5.6405950" minlat="52.0498680" minlon="5.6387020"/>
    </metadata>
    <trk>
    <name>New Track Doe Maar</name>
    <desc>Yeah</desc>
    <type>snowboarding</type>
    <trkseg>
    <trkpt lat="52.0499970" lon="5.6387520">
    <ele>3.00</ele>
    <time>2012-11-15T13:42:17.380+01:00</time>
    </trkpt>
    <trkpt lat="52.0499510" lon="5.6388820">
    <ele>3.00</ele>
    <time>2012-11-15T13:43:32.433+01:00</time>
    </trkpt
</trkpt>
</trkseg>
</trk>
 </gpx>

'trkpt' 属性と、'time' や 'ele' などのその子を取得し、trkpt 'lat'/'lon'、'time' および 'ele' 要素を配列に入れたいと考えています。この作品は現在正常に動作しており、メタデータ情報を取得しています

    $xml = simplexml_load_file("./data/ski1/skitrack.xml");


    //$url = './data/ski1/skitrack.xml';
    //$xml = new SimpleXmlElement($url, null, true);

    $time = $xml->metadata[0]->time;
    $name = $xml->trk->name;
    $desc = $xml->trk->desc;
    $type = $xml->trk->type;
    foreach ($xml->metadata[0]->bounds as $bounds) {
        $maxlat = $bounds->attributes()->maxlat;
        $maxlon = $bounds->attributes()->maxlon;
        $minlat = $bounds->attributes()->minlat;
        $minlon = $bounds->attributes()->minlon; 

    }

しかし、trkpt で試してみると、配列がないというエラーが表示されます: foreach に無効な引数が指定されました

    print_r($xml);


    foreach ($xml->trkseg->trkpt as $trkpt) {
        $lon = $trkpt->attributes()->lon;
    }

私は実際にコードをjavascriptからphpに変換しようとしていますが、javascrで問題なく動作します

        var alat = new Array();
        var alon = new Array();
        var ele = new Array();
        var year = new Array();
        var month = new Array();
        var day = new Array();
        var hours = new Array();
        var minutes = new Array();
        var seconds = new Array();
        var milisec = new Array();

        $(xml).find('trkseg').each(function(){
            $(this).find('trkpt').each(function(i){
                alat[i] = $(this).attr('lat');
                alon[i] = $(this).attr('lon');
                ele[i] = $(this).find('ele').text();
                year[i] = $(this).find('time').text().substr(0,4);
                month[i] = $(this).find('time').text().substr(5,2);
                day[i] = $(this).find('time').text().substr(8,2);
                hours[i] = $(this).find('time').text().substr(11,2);
                minutes[i] = $(this).find('time').text().substr(14,2);
                seconds[i] = $(this).find('time').text().substr(17,2);
                milisec[i] = $(this).find('time').text().substr(20,3);

                if(i > 0) {
                    var laterdate = new Date(year[i],month[i],day[i],hours[i],minutes[i],seconds[i],milisec[i]);
                    var earlierdate = new Date(year[i-1],month[i-1],day[i-1],hours[i-1],minutes[i-1],seconds[i-1],milisec[i-1]);
                    locDistance(alat[i-1], alon[i-1], alat[i], alon[i]);
                    timeDifference(laterdate,earlierdate);
                }

                $('.content').append(i);
                $('.content').append(
                '<br />lat ' + alat[i] +
                '<br />' + 'lon ' + alon[i] +
                '<br / >' + 'ele ' + ele[i] +
                '<br / >' + 'time ' + year[i] + (month[i]-1) + day[i] + hours[i] + minutes[i] + seconds[i] + milisec[i] +
                '<br / >' + 'dist ' + d + '<br / >'
                );

                i = i + 1;

            });
        });

前もって感謝します

4

1 に答える 1

1

あなたが投稿したxmlは検証されませんが(タグがありません)、次のようになると思います:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx creator="Ski Tracks 1.3.3" version="1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
   <metadata>
      <link href="http://www.corecoders.com">
         <text>Core Coders Ltd</text>
      </link>
      <time>2012-11-15T13:52:46.005+01:00</time>
      <bounds maxlat="52.0502500" maxlon="5.6405950" minlat="52.0498680" minlon="5.6387020"/>
   </metadata>
   <trk>
      <name>New Track Doe Maar</name>
      <desc>Yeah</desc>
      <type>snowboarding</type>
      <trkseg>
         <trkpt lat="52.0499970" lon="5.6387520">
            <ele>3.00</ele>
            <time>2012-11-15T13:42:17.380+01:00</time>
         </trkpt>
         <trkpt lat="52.0499510" lon="5.6388820">
            <ele>3.00</ele>
            <time>2012-11-15T13:43:32.433+01:00</time>
         </trkpt>
      </trkseg>
   </trk>
</gpx>

その場合、要素内にネストされているforeach ($xml->trkseg->trkptため、コードを見つけることができません。代わりに、各要素を調べて、各要素内で要素にアクセスすることができます。trksegtrktrktrktrkseg

foreach($xml->trk as $trk)
{
    //do something with each trk

    foreach ($trk->trkseg->trkpt as $trkpt) {

         //do something with each trkseg

    }
} 
于 2012-11-18T00:28:16.673 に答える