0

背景のビット:

こんにちは、みんな、

MVC アプリケーション用に PHP でルーターを作成していて、構造を XML にすることにしました。システム内のすべての有効なルート (ページ) と、関連するコントローラーとアクションを含む XML ファイルがあります。

また、URI の末尾に変数があるかどうかを示す「param」と、それを割り当てる変数名があります (わかりにくい名前です!!)。

私がやっていることは、REQUEST_URI を見て、PHP の爆発関数を使用して、それを「ルート」要素の配列に変換し、それに対してクエリを作成することです。

サンプル 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 パーサーはこの構文を理解しますか? ::parent* メソッドも試しました

乾杯!

4

2 に答える 2

1

..またはは必要ありませんparent::*

代わりにこれを試してください:

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

どちらも必要ないはずですがtext()、PHP もよくわかりません。上記が機能しない場合は、次を試してください。

/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 に答える