php simplexml проверяет, есть ли дочерний дочерний nod?

#php #xml #simplexml

#php #xml #simplexml

Вопрос:

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

 $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 дочернего nod во всем XML-файле? Спасибо.

Комментарии:

1. Это работает так, как и должно быть. Если в первом date элементе нет book элемента, count($xml->book->date) будет возвращен 0, а если в первом есть один date элемент book , count($xml->book->date) будет возвращен 1. Так в чем проблема?

2. @Vikk, я не хочу проверять первый book , но я хочу проверить весь book цикл, есть ли дочерний nod data . так что, может быть, не использовать count , и есть ли какой-либо другой способ проверить, есть ли data во всем XML-файле? Спасибо.

3. рыбак, я взял на себя смелость изменить пример документа. Отмените изменение, если вы не согласны.

4. @VolkerK, да, ситуация, подобная той, которую вы отредактировали. и я получил правильный ответ. спасибо ou.

Ответ №1:

Почему бы вам не попробовать с 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

Ответ №2:

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

 $found = false;
foreach($xml->book as $book)
{
    if(count($book->date)>0)
    {
        $found = true;
        break;
    }
}
  

Ответ №3:

Я думаю, вам не нужно это ‘@’ перед count (….). Попробуйте без этого

Комментарии:

1. Но, поскольку у вас есть несколько элементов «book», вы должны указать, на каком из них вы хотите проверить «date». $xml-> book[0]-> дата