Intereting Posts
Как выводить данные при использовании $ stmt-> fetch (PDO :: FETCH_ASSOC); Как сделать SOAP-вызов PHP с использованием класса SoapClient Как получить идентификатор без участия в doctrine2? Как удалить диакритические знаки из текста? Временная метка Unix для дней, часов, минут Как я могу получить доступ к конфигурации приложения Zend Framework с контроллера? Обновление только одного <div> на странице с помощью обычного Javascript Шифрование и расшифровка текста с помощью RSA в PHP множественное обновление с использованием ajax с php PHP получает начальную и конечную дату недели по недельному номеру Как получить дополнительный массив в PHP? Получение полного PATH загруженного файла – PHP Как изменить значение статических переменных в PHP? Обновление вывода командной строки, то есть для прогресса Как определить «Google Chrome» в качестве пользовательского агента с помощью PHP?

php SimpleXML проверяет, существует ли ребенок

A->b->c может существовать, но c может не существовать. Как это проверить?

Solutions Collecting From Web of "php SimpleXML проверяет, существует ли ребенок"

 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')) { ... 

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

После некоторых экспериментов я обнаружил, что единственным надежным методом проверки наличия узла является использование 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()

Вот сценарий, показывающий результаты от каждого:

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

Использование 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');