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... */
 } 
?>

надеюсь, это поможет!

Другие вопросы по тегам