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>'; // 加个分隔线,每条评论看起来更清晰 } ?>
为什么这次能行?
- 父节点与子节点关联:用
./reviewContent[questionGroup="DEFAULT_OPINION"]这种相对路径的XPath查询,确保只在当前遍历的$review节点下找子节点,不会把其他评论的DEFAULT_OPINION内容混进来。 - 精准筛选子节点:直接通过XPath过滤
questionGroup属性,再也不用硬套固定层级的节点路径(之前的$review->reviewContent->reviewContent->rating只会拿第一个子节点,完全没筛选)。 - 容错处理:加了
!empty($opinionRating)判断,万一某条评论没有DEFAULT_OPINION节点,也不会抛出错误。
之前的代码问题出在哪?
- 第一段代码:硬取第一个嵌套的
reviewContent节点,完全没筛选questionGroup,所以拿到的是DEFAULT_OVERALL的评分,不是你要的评论内容。 - 第二段代码:全局遍历所有
reviewContent节点,根本没关联到它所属的父评论节点,自然拿不到reviewAuthor、city这些父节点信息。
内容的提问来源于stack exchange,提问作者Michel Pouli
相关产品推荐
相关产品推荐

