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 父节点?

Symfony2 XPath 返回重复节点

如何使用simpleXML(php)通过xpath获取父节点

如何在 PHP 中使用 DOM 或 XPATH 获取最近的子节点而不是嵌套的子节点

XPath快速定位节点