PHP 中的 Xpath 父选择器


Xpath parent selector in PHP

一点背景:

嗨,伙计们,

我正在用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;
    }
}