PHP XML XPath - 停止重复节点
Posted
技术标签:
【中文标题】PHP XML XPath - 停止重复节点【英文标题】:PHP XML XPath - Stop duplicate nodes 【发布时间】:2012-01-19 22:38:40 【问题描述】:我正在尝试使用简单 XML 中的 XPath 元素解析 XML 文档。但是下面的这个脚本(在 last.fm API 中搜索条目“U2”时)返回:
Passengers 乘客 Bono 乘客 Bono U2 和 Green Day 乘客 Bono U2 和 Green Day R.E.M.乘客 Bono U2 和 Green Day R.E.M. 英克斯
如您所见,存在重复节点。有没有办法可以阻止显示重复/重复节点?
(php 代码)
$xmlmusic = new SimpleXMLElement($result);
$releases = $xmlmusic->xpath('artist/similar/artist');
foreach ($releases as $artist)
$artistResult .= $artist->name . PHP_EOL;
echo $artistResult;
(XML 文档)
<?xml version="1.0" encoding="utf-8"?>
<lfm status="ok">
<artist>
<name>U2</name>
<mbid>704acdbb-1415-4782-b0b6-0596b8c55e46</mbid>
<url>http://www.last.fm/music/U2</url>
<image size="small">http://userserve-ak.last.fm/serve/34/107345.jpg</image>
<streamable>1</streamable>
<stats>
<listeners>2613654</listeners>
<playcount>96947986</playcount>
</stats>
<similar>
<artist>
<name>Passengers</name>
<url>http://www.last.fm/music/Passengers</url>
<image size="small">http://userserve-ak.last.fm/serve/34/4826014.jpg</image>
</artist>
【问题讨论】:
【参考方案1】:我假设您的 XML sn-p 只是完整结果的一小部分,所以...
您需要修改您的 foreach 循环以检查当前正在处理的艺术家之前是否曾见过。最简单的方法是使用数组:
$seen = array();
foreach ($releases as $artist)
if (!isset($seen[$artist->name]))
$seen[$artist->name] = true;
一旦循环完成,你就会得到一个很好的数组,其中每个艺术家都是 $seen 中的一个键。要复制您的简单字符串连接,您只需 implode/echo:
echo implode(array_keys(', ', $seen));
【讨论】:
它没有返回任何结果,所以我尝试打印数组: $xmlmusic = new SimpleXMLElement($result); $releases = $xmlmusic->xpath('artist/similar/artist'); $seen = 数组(); foreach ($releases as $artist) if (!isset($seen[$artist->name])) $seen[$artist->name] = true; print_r($seen);但是它返回一个空数组?以上是关于PHP XML XPath - 停止重复节点的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 xpath/php 获取 xml 文件中的节点名称?
使用 DOMDocument PHP 获取 Xpath 父节点?
如何使用simpleXML(php)通过xpath获取父节点