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