A->b->c
может существовать, но c
может не существовать. Как это проверить?
Php SimpleXML проверяет, существует ли ребенок
Ответ 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;
Я ненавижу это...
Ответ 5
Метод xpath возвращает массив согласованных элементов или false
if(false !== $A->xpath('b/c')) { ...
Ответ 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, чтобы показать результаты от каждого:
Ответ 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
}