web-dev-qa-db-ja.com

php SimpleXMLは、子が存在するかどうかをチェックします

A->b->cは存在するかもしれませんが、cは存在しないかもしれません。どうやって確認しますか?

58
An employee

これをisset()でラップする方が良いかもしれません

if(isset($A->b->c)) { // c exists

$Aまたは$A->b存在しない...それは爆発しない。

121
null

SimpleXMLは常にObjectを返します。子がない場合、空のオブジェクトが返されます。

if( !empty($a->b)){
  var_dump($a->b);
}
39
CedCannes

children()関数を使用してcount()を実行し、count-callの前に@を置いて子がいない場合はPHPエラーを無視して解決しました。これは愚かですが、動作します:

$identification = $xml->identification;
if (@count($identification->children()) == 0)
  $identification = $xml->Identification;

私はこれが嫌い...

8
scippie

いくつかの実験の後、ノードが存在するかどうかを確認する唯一の信頼できる方法は、count($xml->someNode)を使用することであることを発見しました。

テストケースは次のとおりです。 https://Gist.github.com/Thinkscape/6262156

7
Artur Bodera

メソッドxpathは一致した要素の配列またはfalseを返します

if(false !== $A->xpath('b/c')) { ...

http://www.php.net/manual/ru/simplexmlelement.xpath.php

5
user1391077

PHP 5.3の場合、$a->count()を使用できます。それ以外の場合、@count($a->children())を使用したscippieのソリューションはうまく機能します。@は不要ですが、古いPHP実装で必要になる場合があります。

4
Alex Matulich

if(isset($A->b){を使用すると問題が発生したため、if($A->b){を試してみましたが、うまくいきました!

2
Daydah

単に

var_dump(count($xml->node));
2

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');

属性を確認することもできます。ノードct属性があるかどうかを確認します。

_has_child($a,'b/c/@t');
_
2
CITBL

PHP 5.5.23で動作を確認できる3つの方法は、isset()count()またはempty()を使用していました。

それぞれの結果を表示するスクリプトは次のとおりです。

https://Gist.github.com/mchelen/306f4f31f21c02cb0c24

1
Mike Chelen

ヘルパー関数を使用して、ノードが関数のパラメーターとして提供される有効なノードであるかどうかを確認します。

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'];
}
1
ph.dev

あなたが試すことができます:

if($A->b->c && $A->b->c != '')
0
jgrund

私の経験を共有したいと思いました。 5.4で実行して、「isset」と「empty」でテストを試みましたが、どちらもうまくいきませんでした。最終的にis_nullを使用しました。

if(!is_null($xml->scheduler->outterList->innerList)) {
    //do something
}
0
user857276

名前空間

XMLファイルで名前空間を使用している場合、子をチェックするときに関数呼び出しに名前空間を含める必要があることに注意してください。そうしないと、毎回ゼロが返されます。

if ($XMLelement->children($nameSpace,TRUE)->count()){
    //do something here 
}
0
g-man