2010-01-01 139 views
4

使用DOMXPath :: query可以獲得childNodes的一級深度嗎?XPath獲取一級子節點

例如,如果我有一個像一個文件:

<div> 
    <span> 
     <cite> 
     </cite> 
    </span> 
    <span> 
     <cite> 
     </cite> 
    </span> 
</div> 

我希望節點列表包含只是跨度,而不是引用。

還應該提及它不總是相同的元素(divs,span等)。我需要它來處理任何類型的元素。

這是我嘗試過,它似乎並沒有工作:

//*[not(ancestor::div)] 

回答

3

如果使用

/div/* 

然後你在這個元素的所有直接孩子,但這些孩子的名單包含他們的孩子。我認爲你不能刪除孩子的孩子

有使用默認軸,它被稱爲child::。此軸返回僅在1級元素在當前節點下

*比賽的所有元素,但既沒有屬性也沒有文本()

您必須指定路徑的節點,並小心//node因爲這意味着descendant::node它返回此樹中此名稱的所有節點

+0

感謝孩子::軸建議。這應該是被接受的答案。 – Eternal21 2015-01-07 18:23:39

2

您的問題有點不足,因此有多種解釋方法。如果你想在當前元素(及其所有子元素)的所有直接子元素,然後用

*/* 

對於你的榜樣,這給你

<span> 
    <cite> 
    </cite> 
</span> 

<span> 
    <cite> 
    </cite> 
</span> 

如果你想要所有的小孩節點,然後用node()而不是*

*/node() 

對於您的示例,這會爲您提供上述兩個子元素以及換行符/縮進text()節點。

但是,如果您想要只有子節點,而不是他們的孩子(即,只有span元素,但沒有他們的子元素),則必須使用兩個表達式:

  1. 通過*/*
  2. 過程中選擇的直接子元素的子元素,並只選擇文本節點,而不是孫子元素通過text()

我的PHP是一個有點生疏,但它應該工作有點像這樣:

$doc = new DOMDocument; 
// set up $doc 
$xpath = new DOMXPath($doc); 

// perform step #1 
$childElements = $xpath->query('*/*'); 

$directChildren = array(); 
foreach ($childElements as $child) { 
    // perform step #2 
    $textChildren = $xpath->query('text()', $child); 
    foreach ($textChildren as $text) { 
    $directChildren[] = $text; 
    } 
} 
// now, $directChildren contains all text nodes 
+0

謝謝恩,最後一個是我正在尋找的。只是直接的孩子節點,沒有孫子。你可以擴展更多的例子嗎?我對XPath>非常新,並且還沒有完全點擊。 – Greg 2010-01-01 16:44:08