XML将多个结果分配给PHP变量


XML Assign More Than One Result To PHP Variable

我对此做了一些搜索,但不确定我是否在搜索正确的东西。我发现的例子和事情让我感到困惑,可能把我推向了错误的方向。

我试图找出一个phpwhile语句,或者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;
}

您可以使用DOMDocument提取所有装入点标签

<?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
 }
?>

我想明白了。如此简单,却很难理解。

$total = 0;
foreach($countlisteners->response->data->mountpoints->row as $result){
$total += $result->listenercount;
$items++;
}
echo $total;

通常使用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);