您可以使用DOMDocument::loadHTML()
(或DOMDocument::loadhtmlfile()
)將已損壞的XML轉換爲正確的XML。如果您不喜歡與DOMDocument
對象打交道,請使用saveXML()
並使用SimpleXML加載生成的XML字符串。
$dom = DOMDocument::loadHTMLfile($filepath);
if (!$dom)
{
throw new Exception("Could not load the lax XML file");
}
// Now you can work with your XML file using the $dom object.
// If you'd like using SimpleXML, do the following steps.
$xml = new SimpleXML($dom->saveXML());
unset($dom);
我試過這個腳本:
<?php
$dom = new DOMDocument();
$dom->loadHTMLFile('badformatted.xml');
if (!$dom)
{
die('error');
}
$nodes = $dom->getElementsByTagName('description');
for ($i = 0; $i < $nodes->length; $i++)
{
echo "Node content: ".$nodes->item($i)->textContent."\n";
}
從CLI執行此當輸出:
[email protected]:~/xml$ php test.php
Warning: DOMDocument::loadHTMLFile(): Tag thingy invalid in badformatted.xml, line: 1 in /home/carlos/xml/test.php on line 3
Warning: DOMDocument::loadHTMLFile(): Tag description invalid in badformatted.xml, line: 2 in /home/carlos/xml/test.php on line 3
Node content:
something with bogus
markup not wrapped in CDATA
[email protected]:~/xml$
編輯:一些小的修正和錯誤處理。
edit2:更改爲非靜態調用以避免E_STRICT錯誤,增加了測試用例。
它不是XML,如果它不嚴格;-) – 2011-05-17 13:37:10
您沒有得到XML的觀點:XML的主要想法是,如果它遇到了一個問題,它會殺了你,你的家人,你的朋友和任何你曾經交談過的人。語法錯誤。沒有嚴厲錯誤處理的XML只是不再是XML ^^ – NikiC 2011-05-17 13:41:33
@nikic - 我一直處於與不必處理由第三方提供的破碎的「XML」輸入的OP相同的位置, XML。雖然我同意這並不理想,但當數據必須導入並且我們無法讓第三方修復系統時,我們只需要處理它。 :-( – Spudley 2011-05-17 13:45:20