php simplexml проверить, есть ли у ребенка дочерний узел? - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть много файлов xml, я не хочу получать значение, но проверьте, есть ли у них дочерний кивок или нет. поэтому я использую count вместо foreach. но мой код всегда выводит no, если в первом $xml->book канате нет $xml->book->date.

$xml = simplexml_load_file('some.xml');
if (@count($xml->book->date)>0){
    echo 'yes';
}else{
    echo 'no';
}

XML-дерево, подобное этому

<?xml version="1.0" encoding="utf-8"?>
<Catalog>
    <book>
     <title/><description/><price/>
  </book>
  <book>
     <title/><description/><price/>
     <date/>  //(optional, there may be 0 to n [book] elements having a [date] element in the document)
  </book>
  <book>
     <title/><description/><price/>
  </book>
  <book>
     <title/><description/><price/>
     <date/>
  </book>
</Catalog>

Для этого документа результат рабочей версии "count ($ xml-> book-> date)" должен быть равен 2, то есть> 0

РЕДАКТИРОВАТЬ : возможно, не использовать count, но как проверить, есть или нет date childnod во всем XML-файле? Спасибо.

Ответы [ 3 ]

4 голосов
/ 09 ноября 2011

Почему бы вам не попробовать xpath?

$date=$xml->xpath('/book/date[1]');

if($date){
    echo 'Yes';
}
else{
   echo 'No';
}

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

http://www.w3schools.com/xpath/xpath_syntax.asp

0 голосов
/ 09 ноября 2011

Если вы хотите зарегистрировать весь XML-документ, то, я думаю, вам придется пройтись по всем элементам книги-

$found = false;
foreach($xml->book as $book)
{
    if(count($book->date)>0)
    {
        $found = true;
        break;
    }
}
0 голосов
/ 09 ноября 2011

Полагаю, вам не нужен этот '@' перед подсчетом (....).Попробуй без этого

...