使用SimpleXML和PHP“尝试获取非对象属性”错误

时间:2010-03-13 20:44:38

标签: php simplexml

我正在使用带有SimpleXML的PHP​​脚本来解析XML提要。我无法控制XML的内容。

   try { $xml = @new SimpleXMLElement($fetchResult); } catch (Exception $e) { errorHandle($e->getMessage());}

    $userNick = $xml->View->ScrollView->VBoxView->View->MatrixView->VBoxView[0]->HBoxView->TextView->SetFontStyle->b;
    foreach ($xml->View->ScrollView->VBoxView->View->MatrixView->VBoxView[0]->VBoxView as $pathToSubTree){       
        foreach ($pathToSubTree->MatrixView->View->VBoxView->VBoxView->HBoxView[0]->VBoxView->MatrixView->VBoxView as $canopy){
                //Do some stuff now that we've found the canopy of the tree
        }

        $canopy = $pathToSubTree->MatrixView->View->VBoxView->VBoxView->HBoxView[0]->VBoxView->MatrixView->VBoxView;
        if(is_null($canopy)){
                //Do some stuff stuff is the canopy was not traceable   
        }
    }

    $pathToSubTree = $xml->View->ScrollView->VBoxView->View->MatrixView->VBoxView[0]->VBoxView;
    if(is_null($pathToSubTree)){
         //Do some stuff stuff is the subTree path was not traceable    
    }

    unset($xml);

我遇到了很多错误,我确信这些错误与同样的原因有关:

PHP Notice:  Trying to get property of non-object in myScript.php on line 45
PHP Warning:  Invalid argument supplied for foreach() in myScript.php on line 45
PHP Notice:  Trying to get property of non-object in myScript.php on line 76

第45行(来自上方):

foreach ($pathToSubTree->MatrixView->View->VBoxView->VBoxView->HBoxView[0]->VBoxView->MatrixView->VBoxView as $canopy){

第76行(来自上方):

$canopy = $pathToSubTree->MatrixView->View->VBoxView->VBoxView->HBoxView[0]->VBoxView->MatrixView->VBoxView;

我很确定这个错误是由我的路径中的一个数组不是特定XML的数组引起的,但有时它可能是一个数组。

处理这些问题的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

标签的

可以多次出现或单独出现:

is_array($doc->node) ? $doc->node[0] : $doc->node

或者它可能更容易使用:

$node->xpath('MatrixView/View/XBoxView/VBoxView/HBoxView[1]/VBoxView/MatrixView/VBoxView)

[1]是匹配的第一个元素

答案 1 :(得分:1)

以下是对这些错误消息的解释:

PHP Warning:  Invalid argument supplied for foreach() in myScript.php on line 45

这个很容易。您已经传递了一些无法迭代到foreach的内容,例如foreach (false as $x)。 在你的情况下,你疯狂的$ foo-> bar-> baz系列可能会返回null,因为该元素不存在。

PHP Notice:  Trying to get property of non-object in myScript.php on line 45

“试图获取属性”你肯定知道对象的属性“bar”被写为->bar,“非对象”是指->之前的变量。这意味着在$xml->View->ScrollView->...中的某个地方存在一个不存在的元素,SimpleXML返回null。因此,下一个->会触发该错误。

简而言之,你对元素的“路径”是错误的。