10

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_weather_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 ページを返します。

例外の処理中に追加のキャッチされない例外がスローされました。

オリジナル

ErrorException: property_exists(): ノードが crazy_error() に存在しなくなりました (vvdtn.inc の 183 行目)。

追加

ErrorException: stat(): crazy_error() の /sites/default/files/less/512d40532e2976.99442935 の統計に失敗しました (/includes/stream_wrappers.inc の 689 行目)。


だから今、私はヒステリックに笑ってあきらめています。何らかの形でこのエラーを取得することなく、SimpleXML オブジェクトのプロパティの存在を確認するにはどうすればよいですか?

4

4 に答える 4

1

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();
于 2013-02-26T23:33:58.057 に答える
0

試しました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.
于 2017-09-02T08:11:46.940 に答える