#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
цикл, есть ли дочерний noddata
. так что, может быть, не использоватьcount
, и есть ли какой-либо другой способ проверить, есть лиdata
во всем XML-файле? Спасибо.3. рыбак, я взял на себя смелость изменить пример документа. Отмените изменение, если вы не согласны.
4. @VolkerK, да, ситуация, подобная той, которую вы отредактировали. и я получил правильный ответ. спасибо ou.
Ответ №1:
Почему бы вам не попробовать с xpath?
$date=$xml->xpath('/book/date[1]');
if($date){
echo 'Yes';
}
else{
echo 'No';
}
Ответ №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]-> дата