我正在实现一个小事件管理器以使用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
一起使用?
答案 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();
}