-1

我正在实现一个小事件管理器以使用观察者模式。为了让我的观察者订阅我的事件,我使用了以下 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>

我正在使用 aforeach循环订阅:

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>节点。还有我foreachsubscription 孩子们的循环!为了解决这个问题,我想知道如何检查xml文件是否包含多个<subscription>标签,或者只有一个......

任何帮助将不胜感激 :)

编辑:有没有办法xpath和我一起使用Zend_Config_Xml object

4

2 回答 2

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

希望这有帮助!

于 2012-10-09T07:01:38.067 回答
0

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

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

 $configData = simplexml_load_string($xml);
 foreach($configData->subscriptions->subscription as $subscription)
 {
     echo $subscription->getName(); 
 }
于 2012-10-13T21:24:41.277 回答