You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP提取XML数据:同时获取父节点与指定条件子节点值

搞定XML父节点+指定子节点数据同时提取的问题

嘿,我看你卡在同时捞XML里父评论节点和特定子节点数据的问题上了,咱们来一步步解决它!核心问题就是之前的代码要么没把父节点和子节点的归属关联起来,要么路径找错了,现在给你个靠谱的解决方案:

先理清楚你的XML结构

每个独立的评论是内层的<reviews>节点,它包含两部分关键数据:

  • 顶层基础信息:reviewId、reviewAuthor、city、rating
  • 多个<reviewContent>子节点,其中我们要抓的是questionGroup="DEFAULT_OPINION"那个节点里的rating内容

修正后的可运行代码

<?php
// 加载目标XML文件
$xml = simplexml_load_file("https://www.kiyoh.com/v1/review/feed.xml?hash=bhokkolsgogtaf9");

// 遍历每一条内层的reviews评论节点
foreach ($xml->reviews->reviews as $review) {
    // 重点!在当前评论节点的范围内,精准查询DEFAULT_OPINION对应的rating
    // 用相对路径./确保只查当前review下的子节点,不会串到其他评论
    $opinionRating = $review->xpath('./reviewContent[questionGroup="DEFAULT_OPINION"]/rating');
    
    // 输出父节点的基础评分和信息
    echo '<div class="kiyoh-shop-snippets"><div class="rating-box"><div class="rating" style="width:' . ($review->rating * 10) . '%"></div></div></div>';
    echo 'Naam: ' . $review->reviewAuthor . '<br>';
    echo 'Woonplaats: ' . $review->city . '<br>';
    
    // 输出目标评论内容,记得加空值判断避免报错
    if (!empty($opinionRating)) {
        echo 'Review: ' . trim($opinionRating[0]) . '<br>';
    } else {
        echo 'Review: Geen opinie beschikbaar<br>';
    }
    echo '<hr>'; // 加个分隔线,每条评论看起来更清晰
}
?>

为什么这次能行?

  1. 父节点与子节点关联:用./reviewContent[questionGroup="DEFAULT_OPINION"]这种相对路径的XPath查询,确保只在当前遍历的$review节点下找子节点,不会把其他评论的DEFAULT_OPINION内容混进来。
  2. 精准筛选子节点:直接通过XPath过滤questionGroup属性,再也不用硬套固定层级的节点路径(之前的$review->reviewContent->reviewContent->rating只会拿第一个子节点,完全没筛选)。
  3. 容错处理:加了!empty($opinionRating)判断,万一某条评论没有DEFAULT_OPINION节点,也不会抛出错误。

之前的代码问题出在哪?

  • 第一段代码:硬取第一个嵌套的reviewContent节点,完全没筛选questionGroup,所以拿到的是DEFAULT_OVERALL的评分,不是你要的评论内容。
  • 第二段代码:全局遍历所有reviewContent节点,根本没关联到它所属的父评论节点,自然拿不到reviewAuthor、city这些父节点信息。

内容的提问来源于stack exchange,提问作者Michel Pouli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:43:51