0

一点背景:

嗨,大家好,

我正在为 MVC 应用程序在 PHP 中创建一个路由器,并决定该结构将采用 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"]/..

这似乎总是在 PHPs XPath 中返回 0 个节点,但是使用在线表达式测试器我得到了匹配的入口路径。

谁能解释可能出了什么问题?PHP 的 Xpath 解析器是否理解这种语法?我也试过 ::parent* 方法

干杯!

4

2 回答 2

1

你不应该需要..parent::*

试试这个:

/routes/route[url="blog"]/route[url="entry"]

你也不应该需要text(),但我也不太了解 PHP。F以上不起作用,请尝试:

/routes/route[url/text()="blog"]/route[url/text()="entry"]
于 2012-04-19T19:35:00.707 回答
0

明智的 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;
    }
}
于 2012-04-19T21:59:11.563 回答