按节点深度排序DOMXPath查询结果

时间:2011-01-19 03:29:04

标签: php xpath domxpath

鉴于此示例文档片段:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://localhost/~/zuqml">
<head></head>
<body>
    <zuq:data name="a" />
    <div>
        <zuq:data name="b" />
    </div>
    <div>
        <zuq:data name="c">
            <zuq:format type="trim">
                <zuq:param name="length">300</zuq:param>
                <zuq:param name="append">
                    <span>
                        <zuq:data name="d" />
                    </span>
                </zuq:param>
            </zuq:format>
        </zuq:data>
    </div>
    <div>
        <zuq:data name="e">
            <zuq:format type="trim">
                <zuq:param name="length">300</zuq:param>
                <zuq:param name="append">
                    <span>
                        <zuq:data name="f" />
                    </span>
                </zuq:param>
            </zuq:format>
        </zuq:data>
    </div>
</body>
</html>

我正在尝试抓取<zuq:data />个节点进行操作,但按照一定的顺序:最深的

我目前已达到这一点:

$nodeList = $xpath->query('.//zuq:data[not(ancestor::zuq:region)]');
foreach($nodeList as $node){
    $nodeOrder[] = Array($xpath->evaluate('count(ancestor::*)', $node) => $node->getAttribute('name'));
}

print_r($nodeOrder);

当然会吐出这个:

Array
(
[0] => Array
    (
        [2] => a
    )
[1] => Array
    (
        [3] => b
    )
[2] => Array
    (
        [3] => c
    )
[3] => Array
    (
        [7] => d
    )
[4] => Array
    (
        [3] => e
    )
[5] => Array
    (
        [7] => f
    )
)

现在我正在考虑使用array_multi_sort()usort()命令DOMNode对象进行操作,如果我继续使用当前的'解决方案'。但是,在我看来,有人可能知道更有效的方法来解决这个问题。

有什么想法吗?


注意:对于其他不必要的实现细节,我的XPath查询字符串的功能超出了此处的相关性。我刚从目前的位置拼凑了这个例子。

1 个答案:

答案 0 :(得分:0)

我最终使用usort()对DOM树的操作变得越来越复杂,因此需要回调函数。