我正在实现一个小的事件管理器,以便使用观察者模式。为了让我的观察者订阅我的事件,我使用以下 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
一起使用?
您可以使用 Xpath。
请尝试以下代码,我已经使用您提供的两个示例 XML 对其进行了测试。
<?php
$subscriptions = simplexml_load_file('test.xml');
$scTag = $subscriptions->xpath("//subscription");
foreach($scTag as $subscription) {
echo $subscription->eventName;
/* using $subscription->eventName etc... */
}
?>
希望这个帮助!
澄清一下,这是 PHP 原生 SimpleXML 中不存在的Zend_Config_XML问题。
鉴于您的第二个示例作为$xml
,我可以运行以下内容并按预期获得"订阅"一词:
$configData = simplexml_load_string($xml);
foreach($configData->subscriptions->subscription as $subscription)
{
echo $subscription->getName();
}