Php simplexml组数据

时间:2013-10-31 14:15:41

标签: php simplexml

我正在解析外部xml文件以显示总线的运行方式。

$xmlurl = 'https://api.trafiklab.se/sl/realtid/GetDpsDepartures.xml?siteId=9520&key=XXX';
$xml = simplexml_load_file($xmlurl);

结果如下:

<buses>

<DpsBus>
<Line>Blue</Line>
<Destination>North</Destination>
<Time>5 min</Time>
<DpsBus>

<DpsBus>
<Line>Green</Line>
<Destination>East</Destination>
<Time>7 min</Time>
<DpsBus>

<DpsBus>
<Line>Blue</Line>
<Destination>North</Destination>
<Time>9 min</Time>
<DpsBus>

...

</buses>

现在我显示如下结果:

$i = 0;
while ($i<100) {
echo $xml->Buses->DpsBus[$i]->Line;
echo $xml->Buses->DpsBus[$i]->Destination;
echo $xml->Buses->DpsBus[$i]->Time;
$i++;
}

但我可以以某种方式将这些数据分组到一个表中吗?

结果如下:

蓝北| 7分钟| 10分钟| 25分钟

蓝色南方| 5分钟| 15分钟| 25分钟

绿色南方| 10分钟| 15分钟| 20分钟

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

附注:您的XML需要修复,您需要关闭</DpsBus>

以下是我拍摄的照片:

$xml = simplexml_load_string($x); // assume XML in $x

// get a unique list of lines and destinations...
foreach ($xml->DpsBus as $bus) $lines[(string)$bus->Line.'|'.(string)$bus->Destination]='';
$lines = array_keys($lines);

// get the times
foreach ($lines as $l) {

    list($line,$dest)=explode('|',$l);
    $times = $xml->xpath("//DpsBus[Line='$line' and Destination='$dest']/Time");
    echo "$line $dest: ";
    foreach ($times as $time) echo "$time | ";
    echo "<br />";
}

<强>输出:

Blue North: 5 min | 9 min | 
Green East: 7 min | 

看到它有效:http://codepad.viper-7.com/oy7Jxc

<强>解释

  1. 创建一个唯一的总线和目的地列表代码行4 ):循环遍历整个XML,获取每一行和每个目的地并创建一个关联数组以$lines为关键字的line|destination。关联数组中的键是唯一的。在代码行5 中使用array_keys()会返回一个数组,其中包含所有可能的唯一line|destination组合作为值,例如Blue|North
  2. 现在,循环显示$lines并将line|destination 分隔为$line$destination explode()代码行10
  3. 选择所有<Time> - <DpsBus>个节点的节点,使用<line><destination>使用xpath代码行11 )。
  4. 输出