2013-02-04 11 views
0

我遇到了一個非常奇怪的錯誤。我正在編寫一個函數來驗證基於元素名稱的XML,在這種情況下作爲數組傳入。首先,我將輸入標準化爲一個SimpleXMLElement對象;在這種情況下,我正在傳遞DOMDocument,並且我測試了它,它正確地轉換爲SimpleXMLElement對SimpleXMLElement的getName()調用返回致命錯誤「調用非對象的成員函數」

什麼讓我困惑的是,調用getName()會拋出以下內容:

PHP Fatal error: Call to a member function getName() on a non-object 

但使用exit($xml->getName())(或echo)將返回正確的結果 - 根元素的名字!

相關代碼:

function validateXML($xml, $format='') { 
(get_class($xml) !== 'SimpleXMLElement') ? 
    ((get_class($xml) === 'DOMDocument') ? 
     $xml = simplexml_import_dom($xml) 
     : $xml = simplexml_load_string($xml)) 
    : $xml = $xml; 
$rootName = ($xml->getName()); 
if ($rootName != $format[0]) { 
    exit($xml->getName()))); 
} 

此外,如果它的事項,在服務器運行PHP 5.3

我很新的PHP這樣的幫助是非常感謝!

P.S.要清楚到底是怎麼回事時,下面的代碼:

function validateXML($xml, $format='') { 
    echo(get_class($xml); 
    $xml = simplexml_import_dom($xml); 
    echo(get_class($xml); 
    echo($xml->getName()); 
} 

輸出給服務器

DOMDocument 
SimpleXMLElement 
'ElementName' (the correct root name of my XML document) 

...所以它似乎是工作,但致命錯誤仍然得到拋出。

+0

回覆:「_so它似乎是工作,但致命錯誤仍然得到thrown._ 「:向我們展示引發異常的代碼。你所提供的功能顯然不會拋出你提到的異常,所以還有更多的東西,或者錯誤會在其他時間拋出。發生這個錯誤需要'$ xml',而不是你所說的 - 不是'SimpleXMLElement'實例。 – Tadeck

回答

1

您的代碼(假設它是足夠你寫什麼的問題近)會失敗時$xml是無效的XML,因爲simplexml_load_string()

返回類的SimpleXMLElement的對象包含的屬性數據保存在xml文檔中,或者失敗時發生錯誤

如果您還沒有看到這個,我建議您使用if語句而不是第三語句重寫您的代碼。你的功能,當$xml不是SimpleXMLElement情況下,也不DOMDocument例如,將有效地灌進了以下功能:

function validateXML($xml, $format='') { 
    simplexml_load_string($xml); 
    $rootName = ($xml->getName()); 
    if ($rootName != $format[0]) { 
     exit($xml->getName()); 
    }; 
} 
+0

我非常感謝反饋,但同樣,我的函數的第一部分按預期執行。首先,在傳入一個DOMDocument並對結果調用'get_class()'後,它返回給我'SimpleXMLElement',它告訴我這個問題更難以捉摸。也許我沒有說清楚這一點 - 我在輸入中使用了'exit'和'echo'命令,並且它們返回了調用'getName()'的正確結果,但它仍然會拋出致命錯誤。 –

+1

@ user1575456:我不是在談論這種情況,我是在談論你收到一些東西時的情況_different_。我相信這裏最好的是你使用的確切的代碼和輸入值(縮小到最小代碼再現問題)。那麼應該清楚問題是什麼,我認爲這會告訴你問題的真實性。所以,再次:請給我們一段代碼,在運行後產生你所描述的(即:引發異常)。 – Tadeck

相關問題