A->b->c
は存在するかもしれませんが、c
は存在しないかもしれません。どうやって確認しますか?
これをisset()
でラップする方が良いかもしれません
if(isset($A->b->c)) { // c exists
$A
または$A->b
存在しない...それは爆発しない。
SimpleXMLは常にObjectを返します。子がない場合、空のオブジェクトが返されます。
if( !empty($a->b)){
var_dump($a->b);
}
children()
関数を使用してcount()
を実行し、count-callの前に@を置いて子がいない場合はPHPエラーを無視して解決しました。これは愚かですが、動作します:
$identification = $xml->identification;
if (@count($identification->children()) == 0)
$identification = $xml->Identification;
私はこれが嫌い...
いくつかの実験の後、ノードが存在するかどうかを確認する唯一の信頼できる方法は、count($xml->someNode)
を使用することであることを発見しました。
テストケースは次のとおりです。 https://Gist.github.com/Thinkscape/6262156
メソッドxpathは一致した要素の配列またはfalseを返します
if(false !== $A->xpath('b/c')) { ...
PHP 5.3の場合、$a->count()
を使用できます。それ以外の場合、@count($a->children())
を使用したscippieのソリューションはうまく機能します。@は不要ですが、古いPHP実装で必要になる場合があります。
if(isset($A->b){
を使用すると問題が発生したため、if($A->b){
を試してみましたが、うまくいきました!
単に
var_dump(count($xml->node));
Xpathを使用:
_function has_child(\SimpleXMLElement $parent=null, string $xpathToChild)
{
return isset($parent) && !empty($parent->xpath('('.$xpathToChild.')[1]'));
}
_
ここで、_$parent
_はチェックする子ノードの間接または直接の親であり、_$xpathToChild
_は_$parent
_に関連する子のxpathです。
_()[1]
_は、すべての子ノードを選択したくないためです。 1つで十分です。
$ a-> b-> cが存在するかどうかを確認するには:
has_child($a,'b/c');
属性を確認することもできます。ノードc
にt
属性があるかどうかを確認します。
_has_child($a,'b/c/@t');
_
PHP 5.5.23で動作を確認できる3つの方法は、isset()
count()
またはempty()
を使用していました。
それぞれの結果を表示するスクリプトは次のとおりです。
ヘルパー関数を使用して、ノードが関数のパラメーターとして提供される有効なノードであるかどうかを確認します。
private static function isValidNode($node) {
return isset($node) && $node instanceof SimpleXMLElement && !empty($node);
}
使用例:
public function getIdFromNode($node) {
if (!self::isValidNode($node)) {
return 0;
}
return (int)$node['id'];
}
あなたが試すことができます:
if($A->b->c && $A->b->c != '')
私の経験を共有したいと思いました。 5.4で実行して、「isset」と「empty」でテストを試みましたが、どちらもうまくいきませんでした。最終的にis_nullを使用しました。
if(!is_null($xml->scheduler->outterList->innerList)) {
//do something
}
名前空間
XMLファイルで名前空間を使用している場合、子をチェックするときに関数呼び出しに名前空間を含める必要があることに注意してください。そうしないと、毎回ゼロが返されます。
if ($XMLelement->children($nameSpace,TRUE)->count()){
//do something here
}