PHP使用SimpleXML遍历XML中brand节点输出为空怎么解决
问题原因
- 第一,你的XML文件语法不合法:XML规定只能存在1个顶层根节点,你当前的XML中
<brands>和<producers>是并列的两个顶层节点,simplexml_load_file加载时只会解析第一个顶层节点<brands>,返回的$xml对象本身就对应<brands>节点,而非整个文档的虚拟根。 - 第二,遍历路径错误:你写的
$xml->brands->brand相当于在<brands>节点下再找子节点<brands>,这个路径不存在,拿到的对象本身不是你预期的<brand>节点集合。 - 第三,输出逻辑错误:
<brand>是包含多个子节点的复合节点,本身没有直接的文本内容,直接将其作为字符串输出必然得到空值。
解决方法
- 先修正XML格式,给所有内容套一个统一的顶层根节点,示例如下:
<?xml version='1.0' encoding='UTF-8'?> <data> <brands> <brand> <name>Spielberger Mühle</name> <kuerzel>SPI</kuerzel> <id>e3124594-1d4c-4a72-8c66-37de394fece2</id> <last_modified>27.04.2021 23:00:03</last_modified> <logo> <id>e3124594-1d4c-4a72-8c66-37de394fece2</id> <name>SPI_Spielberger Mühle_e3124594-1d4c-4a72-8c66-37de394fece2.jpg</name> <size>273981</size> <mime_type>image/jpeg</mime_type> <img_width>1533</img_width> <img_height>676</img_height> <last_modified>13.12.2016 12:48:02</last_modified> </logo> <url>www.spielberger-muehle.de</url> <adr_invb_name>Spielberger GmbH</adr_invb_name> <adr_invb_strasse>Burgermühle</adr_invb_strasse> <adr_invb_plz>74336</adr_invb_plz> <adr_invb_ort>Brackenheim</adr_invb_ort> <adr_invb_land_id>8</adr_invb_land_id> </brand> </brands> <producers> <producer> <!-- 原有producers下的内容 --> </producer> </producers> </data>
- 修改PHP遍历代码,修正路径和输出逻辑:
<?php $xml = simplexml_load_file('demo.xml'); // 正确遍历brands下的所有brand节点 foreach ($xml->brands->brand as $index => $brand) { // 单独访问指定字段 echo "品牌名称:" . $brand->name . PHP_EOL; echo "品牌官网:" . $brand->url . PHP_EOL; // 若要遍历当前brand下所有子字段,可嵌套循环 foreach ($brand->children() as $fieldName => $fieldValue) { echo "字段名:$fieldName - 字段值:$fieldValue" . PHP_EOL; } } ?>
如果不想修改XML文件,也可以直接适配现有的加载结果,把遍历代码改成foreach ($xml->brand as $key => $brand)即可,因为原XML加载后$xml本身就是<brands>节点。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

