Programing

자식이 있는지 PHP SimpleXML 확인

lottogame 2020. 12. 10. 08:28
반응형

자식이 있는지 PHP SimpleXML 확인


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 오류를 무시 하여 해결했습니다 . 이것은 어리석지 만 작동합니다.

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

나는이 싫어...


몇 가지 실험 끝에 노드가 존재하는지 확인하는 유일한 신뢰할 수있는 방법은 count($xml->someNode).

다음은 테스트 케이스입니다. https://gist.github.com/Thinkscape/6262156


메서드 xpath는 일치하는 요소의 배열 또는 false를 반환합니다.

if(false !== $A->xpath('b/c')) { ...

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


PHP 5.3이있는 경우 $a->count(). 그렇지 않으면 scippie의 솔루션 @count($a->children())이 잘 작동합니다. @가 필요하지 않지만 이전 PHP 구현에는 필요할 수 있습니다.


사용하면 if(isset($A->b){문제가 생겼으므로 시도했지만 if($A->b){효과가있었습니다!


간단히

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

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

속성을 확인할 수도 있습니다. 노드 ct속성 있는지 확인 합니다.

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

PHP 5.5.23에서 작업을 확인할 수있는 3 가지 방법은 isset() count()또는empty()

다음은 각각의 결과를 보여주는 스크립트입니다.

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


도우미 함수를 사용하여 노드가 함수의 매개 변수로 제공된 유효한 노드인지 확인합니다.

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

시도해 볼 수 있습니다.

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

내 경험을 공유하고 싶다고 생각했습니다. 5.4에서 실행 나는 'isset'과 'empty'로 테스트를 시도했지만 둘 다 나를 위해 일하지 않았습니다. 나는 is_null 을 사용하여 끝났습니다 .

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

네임 스페이스

Be aware that if you are using name spaces in your XML file you will need to include those in your function calls when checking for children otherwise it will return ZERO every time:

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

참고URL : https://stackoverflow.com/questions/1560827/php-simplexml-check-if-a-child-exists

반응형