2009-11-06 81 views
4

如何處理XML文件中損壞的數據?舉例來說,如果我有帶有破損XML數據的PHP DomDocument XML加載

<text>Some &improper; text here.</text> 

我試圖做的事:

$doc = new DOMDocument(); 
$doc->validateOnParse = false; 
$doc->formatOutput = false; 
$doc->load(...xml'); 

,它悲慘的失敗了,因爲有一個未知的實體。請注意,由於軟件寫入的方式,我無法使用CDATA。我在寫一個讀取和寫入XML的模塊,有時用戶插入不正確的文本。我注意到,DOMDocument-> loadHTML()很好地編碼了一切,但我怎麼能從那裏繼續?

+0

loadHTML()有什麼問題?據我瞭解,這是爲了這樣的情況。 – 2009-11-06 12:44:17

+0

「你從那裏繼續」是什麼意思? – philfreo 2009-11-08 02:57:47

+0

實際上生成XML的軟件已經嚴重破壞,您應該嘗試更改 - 或者聯繫可以的人。 – ty812 2009-11-09 04:14:09

回答

0

也許你可以使用preg_replace_callback做實體繁重的你:

http://php.net/manual/en/function.preg-replace-callback.php

function fixEntities($data) { 
    switch(substr($data, 1, strlen($data) - 2)) { 
     case 'amp': 
     case 'lt': 
     case 'gt': 
     case 'quot': // etc., etc., etc. 
      return $data; 
    } 
    return ''; 
} 
$xml = preg_replace_callback('/&([a-zA-Z0-9#]*);{1}/', 'fixEntities', $xml); 
0

如果您是編寫XML的人,那麼應該沒有問題,因爲您可以在將任何用戶輸入插入XML之前將其編碼到實體中。

1

使用htmlspecialchars推輸入您的XML/XHTML DOM之前連載特殊XML字符。雖然它的名稱前綴爲「html」,但它基於它所替換的唯一字符,它對於xml數據序列化來說確實很有用。