Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

if($A->b->c != null) //c exists

Если c не существует, его значение будет null (или, точнее, оно не будет иметь значения). Обратите внимание, однако, что для этого, как A, так и b нужно не быть null. В противном случае PHP вызовет ошибку (я думаю).

Ответ 2

Лучше обернуть это в isset()

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

Таким образом, если $A или $A->b не существует... он не взорвется.

Ответ 3

SimpleXML всегда возвращает объект. Если нет дочернего элемента, возвращается пустой объект.

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

Ответ 4

Я решил его с помощью функции children() и выполнил count() на нем, игнорируя ошибку PHP, если нет детей, поставив @перед вызовом count. Это глупо, но оно работает:

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

Я ненавижу это...

Ответ 6

После некоторых экспериментов я обнаружил, что единственный надежный метод проверки существования узла - это использование count($xml->someNode).

Вот тестовый пример: https://gist.github.com/Thinkscape/6262156

Ответ 7

Если у вас есть PHP 5.3, вы можете просто использовать $a->count(). В противном случае решение scippie с использованием @count($a->children()) работает хорошо. Я считаю, что мне не нужны @, но может потребоваться более ранняя реализация PHP.

Ответ 8

Используя if(isset($A->b){ дал мне проблемы, поэтому я попробовал if($A->b){ и это сработало!

Ответ 9

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

Вы также можете проверить атрибуты. Чтобы проверить, имеет ли узел c атрибут t.

has_child($a,'b/c/@t');

Ответ 10

3 способа подтвердить работу в PHP 5.5.23 состояли в использовании isset() count() или empty()

Вот script, чтобы показать результаты от каждого:

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

Ответ 11

Просто

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

Ответ 12

Я использую вспомогательную функцию, чтобы проверить, является ли узел допустимым узлом, предоставленным в качестве параметра в функции.

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'];
}

Ответ 13

Вы можете попробовать:

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

Ответ 14

Думал, что поделюсь своим опытом. Запуск на 5.4. Я попробовал тестирование с помощью "isset" и "empty", но не работал у меня. Я закончил использование is_null.

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

Ответ 15

Пространства имен

Помните, что если вы используете пространства имен в вашем XML файле, вам нужно будет включать их в вызовы функций при проверке для детей, иначе он будет возвращать ZERO каждый раз:

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