0

我正在解析一个外部 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 分钟

有任何想法吗?

4

1 回答 1

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|destinationas 键创建一个关联数组。关联数组中的键是唯一的。array_keys()代码行 5中使用会返回一个数组,其中包含所有可能的唯一line|destination组合作为值,例如Blue|North.
  2. 现在,循环$lines并分离line|destination$line$destination使用explode()代码行 10
  3. 选择<Time><DpsBus>具有特定<line><destination>使用的节点的所有-nodesxpath代码行 11)。
  4. 输出它
于 2013-11-03T22:00:53.607 回答