2009-05-02 143 views
0

我有以下的剝離下來的PHP代碼...PHP的XPath - 獲取節點位置

foreach ($xpath->query('/html/body//a')} as $queryitem) { 
    $nodeposition = ???; 
    $parentposition = ???; 
} 

...從這個是有可能找到每個節點的位置和位置其父?

例如:

0..<html>
1....<head>
2......<title>
3......<meta>
4......<meta>
5....<body>
6......<div>
7........<a>

這會爲每個標記生成一種ID,併爲其加入的父標記的ID生成一個ID。

那麼結果會= 0 | 1 | 0.2 | 1,3 | 1,4 | 1.5 | 0.6 | 5.7 | 6

+0

您的位置是什麼意思?節點在樹中的位置? – Gumbo 2009-05-02 14:47:52

回答

1

我不相信你將能夠在dom中獲得位置(讀取xpath),除非您自己編寫一些奇特的編碼。

1

您需要了解完整的DOM樹才能解決此問題。但是對於XPath,您只需獲得與路徑匹配的特定子樹。您需要逐個走樹並檢索與XPath匹配的每個元素的信息。但這可能是低效的。如果從根節點向下走樹並計算節點數,可能會更好。

2

如果「位置」你的意思是在先節點(如你似乎你的樣品中暗示)的數量,那麼這將工作(可能不是一流的效率,但仍然):

foreach ($xpath->query('/html/body//a') as $queryitem) { 
    $nodeposition = count($xpath->query('preceding::*', $queryitem)); 

    $parent = $xpath->query('parent::*', $queryitem); 
    if ($parent->length == 1) 
    $parentposition = count($xpath->query('preceding::*', $parent->item(0))); 
    else 
    $parentposition = -1; // or whatever 
} 

未經測試,但您明白了。

另一種方法是對XSLT標識轉換進行編碼,該轉換將位置添加到文檔中的所有節點作爲屬性。然後你可以閱讀你的PHP代碼中的屬性。