一点背景:
嗨,伙计们,
我正在用PHP为MVC应用程序创建一个路由器,并决定该结构将使用XML。我有一个XML文件,其中包含系统中的所有有效路由(页面)及其关联的控制器和操作。
还有一个"参数"来指示 URI 末尾是否有变量以及要将其分配给的变量名称(我知道名称令人困惑!!
我正在做的是查看REQUEST_URI并使用 PHP 的 explode 函数将其转换为"路由"元素数组,然后我为其构建查询。
下面是一些示例 XML:
<routes>
<route>
<url>blog</url>
<params>
<controller>blogController</controller>
<action>indexAction</action>
</params>
<route>
<url>entry</url>
<params>
<controller>blogController</controller>
<action>entryAction</action>
<param>entryId</param>
</params>
</route>
</route>
</routes>
下面是正在构建的查询:
/routes/route/url[text()="blog"]/../route/url[text()="entry"]/..
这似乎总是在 PHP XPath 中返回 0 个节点,但使用在线表达式测试器,我得到了匹配的入口路由。
谁能解释可能出了什么问题?PHP 的 Xpath 解析器能理解这种语法吗?我也尝试过 ::p arent* 方法
干杯!
你不需要..
或parent::*
。
试试这个:
/routes/route[url="blog"]/route[url="entry"]
你也不需要text()
,但我也不是很了解PHP。如果上述方法不起作用,请尝试:
/routes/route[url/text()="blog"]/route[url/text()="entry"]
XPath 明智地得出与 DevNull 相同的结论,只是稍微增加了选择第一个匹配项:
/routes/route[url="blog"]/route[url="entry"][1]
使用对象接口:
$routes = new RoutesXML($xml);
var_dump($routes->fromPath('blog/entry')); # The SimpleXMLElement
var_dump($routes->fromPath('blog/entry2')); # NULL
实现示例:
class RoutesXML
{
private $xml;
public function __construct($xml) {
$this->xml = simplexml_load_string($xml);
}
public function fromPath($path) {
$expression = '/routes';
foreach(explode('/', $path) as $element)
$expression .= "/route[url='$element']";
$expression .= '[1]';
list($route) = $this->xml->xpath($expression) + array(NULL);
return $route;
}
}