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

XML Assign More Than One Result To PHP Variable

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

我试图找出一个 php while 语句,或者 if 语句 return XML 输出的结果。问题是 row/section 我需要的结果数量可能并不总是相同 returned。例如有 ShoutCast 流,有些有 1 个挂载点,有些有 3 个挂载点。每个挂载点都可以有不同数量的听众调谐到该特定挂载。

我的目标:从 XML 中编辑的所有挂载点 return 中获取整数,将它们加在一起得到监听器总数。

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 提取所有 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
 }
?>

我明白了。如此简单,却又难以理解。

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

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

}
echo $total;

您通常使用 Xpath 来做到这一点。它是 XML 文档的查询语言。

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

//listenercount

当您现在使用 SimpleXML 来解析文档时,下面的代码行会在一个数组中为您提供三个 SimpleXMLElements表示要创建总和的三个值:

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

因为你需要这三个元素的整数值之和,所以用array_maparray_sum可以很容易地处理:

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

这会在 $sum 中为您提供您正在寻找的内容:

var_dump($sum); # int(62)

我希望这能让您明白为什么使用 xpath 查询从文档中获取您要查找的信息通常比编写多行代码来遍历文档更好"on your own"。

完整示例:

$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);