Php 检查属性';没有得到的存在;“节点不再存在”;警告
我正在使用SimpleXML。如果用户对my函数的输入无效,则my变量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; } ... } 这符合我的要求
$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.