Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的Xpath父选择器_Php_Xml_Model View Controller_Xpath - Fatal编程技术网

PHP中的Xpath父选择器

PHP中的Xpath父选择器,php,xml,model-view-controller,xpath,Php,Xml,Model View Controller,Xpath,一点背景: 大家好 我正在用PHP为上的MVC应用程序创建一个路由器,并决定该结构将使用XML。我有一个XML文件,其中包含系统中的所有有效路由(页面)及其关联的控制器和操作 还有一个“param”来指示URI的末尾是否有一个变量,以及要分配给它的变量名(名称混乱,我知道!!) 我正在做的是查看REQUEST_URI,并使用PHP的explode函数将其转换为一个“route”元素数组,然后为其构建一个查询 下面是一些示例XML: <routes> <route

一点背景:

大家好

我正在用PHP为上的MVC应用程序创建一个路由器,并决定该结构将使用XML。我有一个XML文件,其中包含系统中的所有有效路由(页面)及其关联的控制器和操作

还有一个“param”来指示URI的末尾是否有一个变量,以及要分配给它的变量名(名称混乱,我知道!!)

我正在做的是查看REQUEST_URI,并使用PHP的explode函数将其转换为一个“route”元素数组,然后为其构建一个查询

下面是一些示例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>
在phpsxpath中,这似乎总是返回0个节点,但使用在线表达式测试仪,我得到了匹配的入口路径

谁能解释一下可能出了什么问题?PHP的Xpath解析器理解这种语法吗?我还尝试了::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;
    }
}

遍历回父级的原因是其他路由不在“url”节点内,它们在其父级内。@managedheap84-对,但这可以在谓词中指定。在我回答的xpath中,返回的路由不在url中。它在一条路线上。如果去掉谓词,则为
/routes/route/route
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;
    }
}