2013-08-03 31 views
1

我收到以下錯誤而遍歷DOM在PHP

Fatal error: Call to undefined method DOMText::getAttribute()

我在做什麼的,我遍歷DOM節點一個接一個。但在某些情況下,我沒有得到適當的DOM節點,從中我可以得到特定的屬性。當我獲取DOMText節點時, - > nodeType == 3總是(不是DOM節點, - > nodeType == 1),因此我無法獲取返回的DOM節點的任何屬性。

我獲取在PHP

$node = $node->nextSibling; 

,並在某些情況下,我還需要獲取前面的節點,以及這樣

$node = $node->previousSibling; 

現在,我的問題是使用下面的語法接下來DOM節點,我如何獲得適當的DOM節點?

我曾嘗試以下功能

function GetNode($oNode) 
{ 
    while($oNode->nodeType != 1) 
     $oNode = $oNode->previousSibling; 
    return $oNode; 
} 

與檢查條件(其中我已經使用該節點),如

while($node && !empty($node) && $node->nodeType == 1 && !preg_match("/^Abc/",$node->getAttribute('class'))) 
{ 
    //further code 
    $node = $node->nextSibling; 
    $node = GetNode($node); 
} 

但是現在,它會在無限循環,因爲它的返回總是節點類型出現問題== 1並且不終止循環。

+0

您的'GetNode'不會更改'$ oNode'的值,這就是它永遠循環的原因。 – DCoder

+1

請發佈您正在解析的xml/html文件的示例。在我看來,有些節點同時包含子元素節點和文本節點 –

+0

@DCoder,我已經更新了代碼。這是印刷錯誤,但在實際代碼:) – NullPointer

回答

3

文本節點是任何其他的DOM元素。這似乎是因爲xml中的標籤之間存在純文本(例如,新行字符)。所以你應該檢查nodeType並跳過文本節點。

在你的代碼中,你在「GetNode」函數中有一個錯誤:你應該使用$ oNode-> nextSibling而不是$ oNode-> previousSibling。

P.S.現代瀏覽器具有跳過文本節點的.nextElementSibling屬性;)

相關問題