簡體   English   中英

按節點深度排序DOMXPath查詢結果

[英]Ordering DOMXPath query results by node-depth

給定此示例文檔片段:

<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 />節點進行操作,但<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查詢字符串所做的工作超出了此處的相關范圍。 我只是從當前所在的位置拼湊了這個示例。

我最終使用usort()操作,因為DOM樹的操作變得越來越復雜,因此必須使用回調函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM