SimpleXML(实际上是Zend_Config_Xml)和foreach:我在迭代哪个标签?

时间:2012-10-09 05:50:20

标签: simplexml zend-config zend-config-xml

我正在实现一个小事件管理器以使用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>标记,或只是一个...

任何帮助将不胜感激:)

修改:有没有办法将xpathZend_Config_Xml object一起使用?

2 个答案:

答案 0 :(得分:1)

您可以使用Xpath

请尝试下面的代码,我已经使用您提供的两个示例XML进行了测试。

<?php

$subscriptions = simplexml_load_file('test.xml');

$scTag = $subscriptions->xpath("//subscription");

 foreach($scTag as $subscription) {
     echo $subscription->eventName;
          /* using $subscription->eventName etc... */
 } 
?>
希望这有帮助!

答案 1 :(得分:0)

为了澄清,这是Zend_Config_XML的一个问题,它在PHP的原生SimpleXML中不存在。

鉴于您的第二个示例为$xml,我可以运行以下内容并按预期获得“订阅”一词:

 $configData = simplexml_load_string($xml);
 foreach($configData->subscriptions->subscription as $subscription)
 {
     echo $subscription->getName(); 
 }