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