XML为PHP变量分配多个结果

时间:2015-03-18 17:17:08

标签: php xml variables

我已经对此进行了一些搜索,但我不确定我是否正在寻找合适的东西。我发现的例子和事情让我感到困惑,并可能把我误导了。

我试图找出一个php while语句,或者if语句来返回XML输出的结果。事情是我需要的行/部分可能并不总是返回相同数量的结果。例如,有ShoutCast流,有些有1个挂载点,有些有3个挂载点。每个安装点可以具有调整到该特定安装的不同数量的侦听器。

我的目标:要从XML中返回的所有挂载点获取整数,请将它们组合在一起以构成大量的侦听器。

XML

<centovacast version="3.1.2" host="host.net">
<response type="success">
<message>Complete</message>
<data>
<status>
<mount>/stream</mount>
<sid>1</sid>
<listenercount>31</listenercount>
<genre>Blues</genre>
<url>http://www.websiteurl.com</url>
<title>Streams Name</title>
<currentsong>Artist Name - Track Name</currentsong>
<bitrate>128</bitrate>
<sourceconnected>1</sourceconnected>
<codec>audio/mpeg</codec>
<displayname>/stream</displayname>
<serverstate>1</serverstate>
<appstate>
<sctrans2>1</sctrans2>
</appstate>
<sourcestate>1</sourcestate>
<reseller/>
<useserver>1</useserver>
<ipaddress>11.11.111.111</ipaddress>
<port>8031</port>
<proxy>0</proxy>
<servertype>ShoutCast2</servertype>
<sourcetype>sctrans2</sourcetype>
</status>
<mountpoints>
<row>
<mount>/stream</mount>
<sid>1</sid>
<listenercount>31</listenercount>
<genre>Blues</genre>
<url>http://www.websiteurl.com</url>
<title>Stream Title Name</title>
<currentsong>Artist Name - Track Name</currentsong>
<bitrate>128</bitrate>
<sourceconnected>1</sourceconnected>
<codec>audio/mpeg</codec>
<displayname>/stream</displayname>
</row>
<row>
<mount>/live</mount>
<sid>2</sid>
<listenercount>0</listenercount>
<genre/>
<url/>
<title/>
<currentsong/>
<bitrate>0</bitrate>
<sourceconnected>0</sourceconnected>
<codec/>
<displayname>/live</displayname>
</row>
</mountpoints>
</data>
</response>
</centovacast>

所以在上面我知道如何使用以下代码单独拉出每个挂载的监听器。

$countlisteners->response->data->mountpoints->row[0]->listenercount;

这给了我第一次安装的结果,将0切换为1给了我第二次安装,依此类推。

我需要的是php,它将计算存在多少个坐载,并将每个结果分配给一个变量,然后我可以使用它来加总以获得总计。有没有办法做到这一点?

做这样的事情怎么样?

$countlisteners = simplexml_load_file('http://urltoxml.com');
foreach($countlisteners->response->data->mountpoints->row->listenercount as $result){
$total = $result;
echo $total;
}

3 个答案:

答案 0 :(得分:0)

您可以使用DOMDocument提取所有 mountpoint 标记

<?php
$xml="Your xml document content here";
$dom = new DOMDocument;
$dom->loadXML($xml);
$books = $dom->getElementsByTagName('mountpoints');
foreach ($mountpoints as $mountpoints) {
echo $mountpoints->nodeValue;
     //you can add your count variable here
     //nodeValues can be assigned to varables
 }
?>

答案 1 :(得分:0)

我明白了。如此简单,但很难弄清楚。

$total = 0;
foreach($countlisteners->response->data->mountpoints->row as $result){

$total += $result->listenercount;
$items++;

}
echo $total;

答案 2 :(得分:0)

您通常使用Xpath执行此操作。它是XML文档的查询语言。

您对所有listenercount元素感兴趣,这些元素的Xpath表达式可以简单如下:

//listenercount

当你现在使用SimpleXML来解析文档时,下面一行代码在数组中为你提供了三个 SimpleXMLElement ,它们代表了你想要创建总和的三个值:

$array = simplexml_load_string($buffer)->xpath('//listenercount');

由于您需要这三个元素的整数值之和,因此可以使用array_maparray_sum轻松处理:

$sum   = array_sum(array_map('intval', $array));

这会让你在$sum找到你想要的东西:

var_dump($sum); # int(62)

我希望这能让您了解为什么通过文档中的xpath查询获取您正在寻找的信息通常更好,而不是编写多行代码来“自行”遍历文档。

完整的例子:

$buffer = <<<XML
<centovacast version="3.1.2" host="host.net">
<response type="success">
<message>Complete</message>
<data>
<status>
<mount>/stream</mount>
<sid>1</sid>
<listenercount>31</listenercount>
<genre>Blues</genre>
<url>http://www.websiteurl.com</url>
<title>Streams Name</title>
<currentsong>Artist Name - Track Name</currentsong>
<bitrate>128</bitrate>
<sourceconnected>1</sourceconnected>
<codec>audio/mpeg</codec>
<displayname>/stream</displayname>
<serverstate>1</serverstate>
<appstate>
<sctrans2>1</sctrans2>
</appstate>
<sourcestate>1</sourcestate>
<reseller/>
<useserver>1</useserver>
<ipaddress>11.11.111.111</ipaddress>
<port>8031</port>
<proxy>0</proxy>
<servertype>ShoutCast2</servertype>
<sourcetype>sctrans2</sourcetype>
</status>
<mountpoints>
<row>
<mount>/stream</mount>
<sid>1</sid>
<listenercount>31</listenercount>
<genre>Blues</genre>
<url>http://www.websiteurl.com</url>
<title>Stream Title Name</title>
<currentsong>Artist Name - Track Name</currentsong>
<bitrate>128</bitrate>
<sourceconnected>1</sourceconnected>
<codec>audio/mpeg</codec>
<displayname>/stream</displayname>
</row>
<row>
<mount>/live</mount>
<sid>2</sid>
<listenercount>0</listenercount>
<genre/>
<url/>
<title/>
<currentsong/>
<bitrate>0</bitrate>
<sourceconnected>0</sourceconnected>
<codec/>
<displayname>/live</displayname>
</row>
</mountpoints>
</data>
</response>
</centovacast>
XML;

$array = simplexml_load_string($buffer)->xpath('//listenercount');
$sum   = array_sum(array_map('intval', $array));
var_dump($sum);