A->b->c может существовать, но c может не существовать. Как это проверить?
if($A->b->c != null) //c exists
Если c не существует, его значение будет null (или, точнее, оно не будет иметь значения). Обратите внимание, однако, что для этого для работы, как для A и для b не должно быть null . В противном случае PHP вызовет ошибку (я думаю).
Возможно, было бы лучше обернуть это в isset()
if(isset($A->b->c)) { // c exists
Таким образом, если $A или $A->b не существует … он не взорвется.
SimpleXML всегда возвращает Object. Если дочерний объект отсутствует, возвращается пустой объект.
if( !empty($a->b)){ var_dump($a->b); }
Я решил это, используя функцию children() и выполнив count() , игнорируя ошибку PHP, если нет детей, поставив @ перед вызовом count. Это глупо, но это работает:
$identification = $xml->identification; if (@count($identification->children()) == 0) $identification = $xml->Identification;
Я ненавижу это…
Метод xpath возвращает массив согласованных элементов или false
if(false !== $A->xpath('b/c')) { ...
После некоторых экспериментов я обнаружил, что единственным надежным методом проверки наличия узла является использование count($xml->someNode) .
Вот тестовый пример: https://gist.github.com/Thinkscape/6262156
Если у вас есть PHP 5.3, вы можете просто использовать $a->count() . В противном случае решение @count($a->children()) с использованием @count($a->children()) работает хорошо. Я нахожу, что мне не нужен @, но для него могут понадобиться старые PHP-реализации.
Использование if(isset($A->b){ дал мне проблемы, поэтому я попытался, if($A->b){ и это сработало!
Просто
var_dump(count($xml->node));
Вы можете попробовать:
if($A->b->c && $A->b->c != '')
Думал, что поделюсь своим опытом. Запуск на 5.4. Я попробовал тестирование с помощью «isset» и «empty», но не работал для меня. Я закончил использование is_null .
if(!is_null($xml->scheduler->outterList->innerList)) { //do something }
Пространства имен
Имейте в виду, что если вы используете пространства имен в вашем XML-файле, вам нужно будет включить их в вызовы функций при проверке для детей, иначе он будет возвращать ZERO каждый раз:
if ($XMLelement->children($nameSpace,TRUE)->count()){ //do something here }
3 способа, которыми я могу подтвердить работу в PHP 5.5.23, использовали isset() count() или empty()
Вот сценарий, показывающий результаты от каждого:
Использование xpath:
function has_child(\SimpleXMLElement $parent=null, string $xpathToChild) { return isset($parent) && !empty($parent->xpath('('.$xpathToChild.')[1]')); }
где $parent является косвенным или прямым родителем дочернего узла для проверки, а $xpathToChild является xpath для ребенка относительно $parent .
()[1] заключается в том, что мы не хотим выбирать все дочерние узлы. Одного достаточно.
Проверить, существует ли $ a-> b-> c:
has_child($a,'b/c'); или has_child($a->b,'c');
Вы также можете проверить атрибуты. Чтобы проверить, имеет ли узел c атрибут t .
has_child($a,'b/c/@t');