2017-02-26 43 views
1

我有一個非常簡單的實現,它引入一個XML測試位並嘗試使用DOMDocument對其進行驗證。在測試中,它能夠通過LoadHTML()調用,但只要我嘗試並運行validate(),瀏覽器就會永久掛起並且不會加載。下面的代碼:在XML上使用DOMDocument驗證()導致無限加載

$content = '<?xml version="1.0" encoding="utf-8"?><mainElement></mainElement>'; 

$dom = new DOMDocument; 
$dom->LoadHTML($content); 

if (!$dom->validate()) { 
    echo 'fail'; 
} else { 
    echo 'success!'; 
} 
+1

那麼,爲什麼你想用'loadHTML'而不是'loadXML'解析XML? –

回答

1

看來,如果你想驗證內容加載loadHTML,你需要DOCTYPEdeclaration(如果沒有它,你就會得到一個不定式循環)。例如,下面的代碼工作,並打印fail

$content = " 
    <!DOCTYPE html> 
    <html> 
    <body> 
    Content of the document...... 
    </body> 
    </html> 
"; 

$dom = new DOMDocument(); 
$dom->loadHTML($content); 

if (!$dom->validate()) { 
    echo 'fail'; 
} else { 
    echo 'success!'; 
} 

對於XML它更寬容(它的工作原理,即使你沒有申報dtd但它返回false)。在你的情況下,你可以使用loadXML方法,你的代碼將打印fail

經測試php 7.0.13

+0

這是有道理的,我已經切換到使用loadXML建議並現在'失敗'。不過,我很好奇,爲什麼這不能驗證?我期待着取得成功。 – carbide20

+1

@ carbide20由於您沒有指定'dtd',因此失敗。驗證是檢查你的xml是否基於你的'dtd'的過程。查看https://www.w3schools.com/xml/xml_dtd.asp。 –

+0

現在我明白了,謝謝你解釋這個,花時間回答! – carbide20