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

XML将多个结果分配给PHP变量,php,xml,variables,Php,Xml,Variables,我对此做了一些研究,但我不确定我在寻找正确的东西。我发现的例子和事情让我困惑,可能让我走错了方向 我试图找出一个php while语句或if语句来返回XML输出的结果。问题是我需要的行/节可能并不总是返回相同数量的结果。例如,有ShoutCast流,有些有1个装入点,有些有3个装入点。每个装载点可以有不同数量的侦听器调谐到该特定装载 我的目标是:从XML中返回的所有装入点中获取整数,将它们加在一起形成一个侦听器总数 XML <centovacast version="3.1.2" host

我对此做了一些研究,但我不确定我在寻找正确的东西。我发现的例子和事情让我困惑,可能让我走错了方向

我试图找出一个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>
这将给出第一次装载的结果,将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解析文档时,以下代码行在一个数组中为您提供了三个SimpleXMLElements,它们表示要创建的三个值之和:

$array = simplexml_load_string($buffer)->xpath('//listenercount');
由于您需要这三个元素的整数值之和,因此可以使用
array\u map
array\u 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);

$buffer=那么在上面的代码中我唯一需要更改的就是XML文档的位置?那么,如何使用nodeValue对返回的每个结果进行循环?另外,nodeValue是我需要更改为listenercount的东西…还是我将其保留为nodeValue…对不起,我是XML和PHP的新手。我非常感谢您的帮助,帮助我学习一些知识。我编辑了我的原始帖子,其中包含了一些我尝试过的内容,因为我无法让您的示例与DOM一起工作。请参阅官方文档谢谢!我也将尝试这种方式。
$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);