PHP循环遍历XML错误:尝试获取非对象的属性

时间:2013-04-18 08:44:19

标签: php xml

function loadFilesToArrays(){
    $notpromo1Array = simplexml_load_file('pages/hegnar/source/1/notpromo-1_08_04_2013_1.xml');
        foreach($notpromo1Array as $xml){
            echo $xml -> getName();
            echo "<br>";
            echo $xml -> ORDREHODE -> SluttkundeNr;
            echo "<br>";
        }
}

我的XML看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<IS_DATA>
<ORDRER class="linked-list">
    <ORDREHODE>
        <ORDREKUNDENR>10541</ORDREKUNDENR>
        <SluttkundeNr>1240</SluttkundeNr>
                    <AND OTHER PROPERTIES></AND OTHER PROPERTIES>..........
    </ORDREHODE>
    <ORDREHODE>
        <ORDREKUNDENR>10541</ORDREKUNDENR>
        <SluttkundeNr>1344</SluttkundeNr>
                    <AND OTHER PROPERTIES></AND OTHER PROPERTIES>..........
    </ORDREHODE>
    <ORDREHODE>
        ETC ETC ETC ..................
    </ORDREHODE>
</ORDRER>
</IS_DATA>

XML正确结束等,我使用了notepad ++的xml验证器。

我不明白为什么当我调用loadFilesToArray函数时,我收到此错误注意:尝试在第104行的/path/to/file/page1.php中获取非对象的属性 IS_DATA毕竟用大括号和单引号括起来,因为我看到很多人在想要回显XML中的属性名称中具有特殊字符的XML数据时所指的。

3 个答案:

答案 0 :(得分:1)

请立即在同一文件夹

中提供xml文件的正确路径a.xml和test.php

<强> A.XML

<?xml version="1.0" encoding="UTF-8"?>
<IS_DATA>
<ORDRER class="linked-list">
    <ORDREHODE>
        <ORDREKUNDENR>10541</ORDREKUNDENR>
        <SluttkundeNr>1240</SluttkundeNr>
                    <ANDOTHERPROPERTIES></ANDOTHERPROPERTIES>
    </ORDREHODE>
    <ORDREHODE>
        <ORDREKUNDENR>10541</ORDREKUNDENR>
        <SluttkundeNr>1344</SluttkundeNr>
                    <ANDOTHERPROPERTIES></ANDOTHERPROPERTIES>
    </ORDREHODE>
    <ORDREHODE>
        ETC ETC ETC ..................
    </ORDREHODE>
</ORDRER>
</IS_DATA>

<强> test.php的

    <?php
$notpromo1Array = simplexml_load_file("a.xml");
foreach($notpromo1Array as $xml)
  {
    foreach($xml as $child)
    {
        echo $child->getName();
        echo "<br>";
        echo $child->SluttkundeNr;
        echo "<br>";
    } 
  }

 /*RESULT
  * ORDREHODE
    1240
    ORDREHODE
    1344
    ORDREHODE
  */

?> 

答案 1 :(得分:1)

您需要调试代码:

foreach ($notpromo1Array as $xml)
{
    echo $xml->getName(), "\n";
}

这将为您提供$xml所代表的元素的名称:

ORDRER

由于此元素没有任何<IS_DATA>子元素,simplexml会为您提供NULL。然后你访问->ORDRER上的NULL,因为它不是一个对象而无效:

  

注意:尝试获取非对象的属性

这很简单。只需访问正确的元素,你就可以了:

foreach ($notpromo1Array as $xml)
{
    echo $xml->getName(), "\n";
    echo $xml->ORDREHODE->SluttkundeNr, "\n";
}

输出:

ORDRER
1240

答案 2 :(得分:0)

刚做了一个快速测试,这就是我想出来的。替换此 foreach 代码:

foreach($notpromo1Array as $xml){
   echo $xml->ORDREHODE->SluttkundeNr;
   echo "<br />";
}

仅供参考,我使用以下XML文件作为示例,它打印了1240:

<?xml version="1.0" encoding="UTF-8"?>  
<IS_DATA>
    <ORDRER class="linked-list">
        <ORDREHODE>
            <ORDREKUNDENR>10541</ORDREKUNDENR>
            <SluttkundeNr>1240</SluttkundeNr>
        </ORDREHODE>
    </ORDRER>
</IS_DATA>