SimpleXML (фактически Zend_Config_Xml) и foreach: какой тег я повторяю?
Я реализую небольшой менеджер событий, чтобы использовать шаблон Observer. Чтобы подписать моих наблюдателей на мои события, я использую следующий XML-файл:
<?xml version="1.0" encoding="UTF-8"?>
<configData>
<subscriptions>
<subscription>
<eventName>event_name</eventName>
<class>My_Observer_Class</class>
<function>myFunction</function>
</subscription>
<subscription>
<eventName>other_event_name</eventName>
<class>My_Observer_Otherclass</class>
<function>myOtherFunction</function>
</subscription>
</subscriptions>
</configData>
Я использую foreach
цикл на подписки:
foreach($subscriptions->subscription as $subscription) {
/* using $subscription->eventName etc... */
}
И все в порядке, каждый $subscription
предмет имеет это eventName
так далее...
Но тут возникает моя проблема:
<?xml version="1.0" encoding="UTF-8"?>
<configData>
<subscriptions>
<subscription>
<eventName>event_name</eventName>
<class>My_Observer_Class</class>
<function>myFunction</function>
</subscription>
</subscriptions>
</configData>
Здесь у меня есть только один <subscription>
узел. И мой foreach
петли на subscription
дети! Чтобы решить эту проблему, я хотел бы знать, как я могу проверить, содержит ли файл XML несколько <subscription>
теги, или только один...
Любая помощь будет оценена:)
Изменить: есть ли способ использовать xpath
со мной Zend_Config_Xml object
?
2 ответа
Просто чтобы уточнить, это проблема Zend_Config_XML, которой нет в простом PHPX PHP.
Учитывая ваш второй пример как $xml
Я могу запустить следующее и получить слово "подписка", как и ожидалось:
$configData = simplexml_load_string($xml);
foreach($configData->subscriptions->subscription as $subscription)
{
echo $subscription->getName();
}
Вы можете использовать Xpath.
Пожалуйста, попробуйте код ниже, я проверил его с двумя примерами XML, которые вы предоставили.
<?php
$subscriptions = simplexml_load_file('test.xml');
$scTag = $subscriptions->xpath("//subscription");
foreach($scTag as $subscription) {
echo $subscription->eventName;
/* using $subscription->eventName etc... */
}
?>
надеюсь, это поможет!