2011-06-01 112 views
1

我使用PHP來生成XML文件。我使用下面的一些代碼來避免錯誤。如何解決「simplexml_load_file()解析器錯誤:實體'nbsp'未定義」?

$str = str_ireplace(array('<','>','&','\'','"'),array('&lt;','&gt;','&amp;','&apos;','&quot;'),$str); 

但仍導致錯誤。

simplexml_load_file() [function.simplexml-load-file] *[file name]* parser error : Entity 'nbsp' not defined in *[file name] [line]* 

錯誤文本的位置:

Dallas&nbsp;&nbsp;Dallas() is the third-largest city in Texas and the ninth-largest in the United States. 

在IE8,它似乎在()故障。那麼我應該注意到多少個符號?

+0

' '在默認情況下未在XML中定義。也許只是用一個空間替換它就足夠了? – 2011-06-01 23:14:11

+0

你說你使用PHP來*生成* XML文件;你在用什麼?如果你使用的是正確的工具,它應該爲你處理這些實體... – 2011-06-01 23:16:35

回答

4

&nbsp;是一個HTML實體,但不存在於XML中。

要麼擺脫它(你不是說它來自哪裏,所以很難給出更具體的建議),或者將你的HTML數據包裝在CDATA塊中,以便解析器忽略它們。

+0

所以如果我使用CDATA,我還需要使用'str_ireplace'嗎?謝謝。 – cj333 2011-06-01 23:22:58

+0

@ cj333不,你不應該使用str_ireplace – 2013-11-29 12:58:38

3

HTML特定實體 - 在這種情況下&nbsp; - 不是有效的xml實體,這就是simplexml所抱怨的;它將該文件讀取爲xml(而不是html)並查找無效的實體。您需要將HTML實體轉換回其字符表示第一個(可以使用html_entity_decode()做到這一點)

$str = "some string containing html"; 
// this line will convert back html entities to regular characters 
$str = html_entity_decode($str, ...); 
// now convert special character to their xml entities 
$str = str_ireplace(array('<','>','&','\'','"'),array('&lt;','&gt;','&amp;','&apos;','&quot;'),$str); 

save_to_xml($str); 

請注意,如果你將其保存在XML之前用你的字符串ヶ輛(),那麼這就是您的問題的來源(因爲您正在將html字符轉換爲其各自的html實體,而這些實體不會被simplexml識別爲xml實體)。

// this won't work, the html entities it will uses are not valid xml entities 
$str = htmlentities($str, ...) 

save_to_xml($str); 

如果你有麻煩了解它,認爲它是兩個不同的語言,如西班牙語(HTML)和英語(XML),西班牙語( )有效的字並不意味着它也是有效的英語,不管這兩種語言的相似之處。

相關問題