检查属性';存在而没有得到";节点不再存在";警告


Check for property's existence without getting "Node no longer exists" warning

我使用的是SimpleXML。如果用户对我的函数的输入无效,那么我的变量$x是一个空的SimpleXMLElement对象;否则,它具有已填充的属性$x->Station。我想检查一下Station是否存在。

private function parse_weather_xml() {
    $x = $this->weather_xml; 
    if(!isset($x->Station)) {
        return FALSE;
    }
    ...
}

这是我想要的,除了它返回一个错误:

警告:WeatherData::parse_weather_xml((:节点在WeatherData->parse_wather_xml(((vvdtn.inc的第183行(中不再存在。

好的,那么isset()就出局了。让我们试试这个:

private function parse_weather_xml() {
    $x = $this->weather_xml; 
    if(!property_exists($x, 'Station')) {
        return FALSE;
    }
    ...
}

这种行为几乎相同:

警告:property_exists((:WeatherData->parse_weather.xml(((vvdtn.inc的第183行(中不再存在节点

好吧,好吧,我会把它变成一个例外并忽略它。我以前从未这样做过,我也不确定我做得对,但我会尝试一下:

function crazy_error($errno, $errstr, $errfile, $errline) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
...
    private function parse_weather_xml() {
        set_error_handler('crazy_error');
        $x = $this->weather_xml; 
        if(!property_exists($x, 'Station')) {
            return FALSE;
        }
        restore_error_handler();
        ...
    }

它返回自己的HTML页面:

在处理异常时引发了其他未捕获的异常

原件

错误异常:property_exists((:节点不再存在于crazy_error((中(vvdtn.inc的第183行(。

附加

错误异常:stat((:crazy_error((中的/sites/default/filess/512d40532e2976.99442935的stat失败(/includeds/stream_wrappers.inc的第689行(。


所以现在我歇斯底里地笑着放弃了。如何在不以某种形式出现此错误的情况下检查SimpleXML对象的属性是否存在?

是否要检查simplexml是否包含某个节点?-->数数他们!

编辑:节点不存在时出错-->尝试xpath:

if ($xml->xpath("//station")->Count()==0) echo "no station!";

如果没有站点节点,将抛出错误:

假设$xml是你的simplexmlstation在顶层:

 if ($xml->station->Count()==0) echo "no station!";

如果"站"是<something>的孩子,你当然会去。。。

... $xml->something->station->Count();
if (!$x || !$x->Station) {
    return false;
}

重要的是!$x,您需要检查这个xml对象是否为空。如果它是真的,那么在任何尝试解析$x->Station时,都可能会出现此错误。

首先检查您是否错误地试图在尝试检查的代码位之前访问属性而不进行检查(有时错误消息与行号不准确(。

然后我用了isset,它运行良好:

 if(isset($xml->element))
 {
      // $xml has element 
 }

您尝试过property_exists()吗?

private function parse_weather_xml() {
  $x = $this->weather_xml; 
  if(!property_exists($x,"Station")) {
    return FALSE;
  }
...
}

并考虑到这一点:

As opposed with isset(), property_exists() returns TRUE even if the property has the value NULL.