Php 检查属性';没有得到的存在;“节点不再存在”;警告

Php 检查属性';没有得到的存在;“节点不再存在”;警告,php,xml,drupal,error-handling,simplexml,Php,Xml,Drupal,Error Handling,Simplexml,我正在使用SimpleXML。如果用户对my函数的输入无效,则my变量$x是一个空的SimpleXMLElement对象;否则,它有一个已填充的属性$x->Station。我想检查一下站是否存在 private function parse_weather_xml() { $x = $this->weather_xml; if(!isset($x->Station)) { return FALSE; } ... } 这符合我的要求

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

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

    ...
}
这符合我的要求,只是返回了一个错误:

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

好的,
isset()
退出。让我们试试这个:

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

    ...
}
其行为几乎相同:

警告:属性_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页面:

处理异常时引发其他未捕获异常。 起初的 ErrorException:属性_exists():节点不再存在于疯狂_error()中(vvdtn.inc的第183行)

附加的 ErrorException:stat():疯狂错误()中/sites/default/files/less/512d40532e2976.99442935的stat失败(包括/stream_wrappers.inc的第689行)



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

是否要检查您的
SimpleXML
是否包含某个节点?-->数一数

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

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

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

假设
$xml
是您的
simplexml
,并且
站位于顶层:

 if ($xml->station->Count()==0) echo "no station!";
如果“站”是,比如说,一个
的孩子,你当然会去

... $xml->something->station->Count();

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

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

然后我使用了isset,效果很好:

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

您是否尝试过
属性\u exists()

并考虑到本说明:

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

我可能要等到15个小时后才会查看这篇文章;今天我不想再看这个愚蠢的问题了。你说你想忽略错误,但你却把它扔掉了,没有抓住它。。。我可能是错的,但是……如果没有代码的上下文,我无法确定,但我怀疑SimpleXML正在抱怨
$x
(也称
$this->weather\u xml
)本身没有设置,不是说它没有包含
节点。@IMSoP它已设置;它是一个空的SimpleXML对象。见我上面的第二句话。好主意,但已经考虑到了。我在这里遇到了同样的问题,你最后找到解决方案了吗@第75个长号请注意,
$xml station->Count()
(或
->Count()
?)可以更习惯地写成
Count($xml station)
。SimpleXML就是这样。不幸的是,这返回了相同的错误<代码>警告:count():节点不再存在于WeatherData->parse_weather_xml()(vvdtn.inc的第183行)
。我已经设法从附近不相关的函数中获得了更多类似这样的错误,所以我放弃了,并将逻辑移到了以前的函数中,在那里最初获取XML。现在一切似乎都正常了,所以这个问题现在纯粹是学术性的。@michi For
->xpath()
您不能使用
->Count()
-它返回一个普通的PHP数组。(我认为其原理是,它就像整个文档中的一组搜索结果,而SimpleXML对象总是表示XML文档的某个连续部分)@IMSoP好的,我正在努力解决这个问题,介意看看这个吗?
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.