2011-05-12 50 views
3

這是驅使我堅果,在網上有很多類似的問題,但我找不到合適的解決方案。實體聲明在PHP生成的XML文檔(  —等)

我在php中創建一個xml文檔,作爲對ajax請求的響應發送。答案看起來是這樣的:

<?xml version="1.0" encoding="iso-8859-1"?> 
<response> 
    <status>success</status> 
    <message>&nbsp;&mdash;</message> 
</response> 

該標籤將包含比這更有意義的信息,但它是像那些給我這個問題的實體。

,其生成XML是下面的PHP代碼:

header("Content-Type: text/xml"); 

$dom = new DOMDocument('1.0', 'iso-8859-1'); 
$dom->formatOutput = true; 

$response_node = $dom->createElement("response"); 
$dom->appendChild($response_node); 
$response_node->appendChild($dom->createElement('status', 'success')); 
$response_node->appendChild($dom->createElement('message', "&nbsp;&mdash")); 
echo $dom->saveXML(); 
return; 

以上所示的XML成功返回到發出呼叫的JavaScript功能,但是,當它試圖解析XML文檔,它失敗。

如果我嘗試驗證使用this validator我得到以下錯誤的XML:

This page contains the following errors:

error on line 5 at column 15: Entity 'nbsp' not defined

&mdash;造成同一問題的實體。

我想我可能需要找到一種方法,把像這樣的XML:

<!ENTITY name "entity_value"> 

我不知道怎麼雖然做到這一點,或者如果它是正確的方式去做。我不是正確的道路嗎?如果是這樣,我該怎麼做?如果不是,解決這個問題的正確方法是什麼?

回答

2

這是爲了解決該問題,添加一個DOCTYPE聲明定義了實體的一種方法:

$dom = new DOMDocument('1.0', 'iso-8859-1'); 
$dom->formatOutput = true; 
$doctype = DOMImplementation::createDocumentType("html","-//W3C//DTD XHTML 1.1//EN","http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"); 
$dom->appendChild($doctype); 

$response_node = $dom->createElement("response"); 
$dom->appendChild($response_node); 
$response_node->appendChild($dom->createElement('status', 'success')); 
$response_node->appendChild($dom->createElement('message', "&nbsp;&mdash")); 
echo $dom->saveXML(); 
return; 
2

正如您所指出的那樣,HTML實體名稱在XML中無效,沒有用<!ENTITY name "...">來定義它們。但是數字實體會做到這一點。

嘗試更換:

&nbsp; =>&#xA0;

&mdash; =>&#x2014;

+0

我不是手動放置這些實體,它們是在我追加一個包含這些元素的textnode時創建的,文本是從數據庫中查詢的。有沒有一個函數將命名實體轉換爲它們的數字對等體? – Matthew 2011-05-12 01:04:37

+0

您可以使用'$ trans = get_html_translation_table(HTML_ENTITIES)'將字符翻譯錶轉換爲實體並執行類似'$ table [$ value] ='&#'的操作。 ord($ key)。 ';';'爲'$ trans'中的每個鍵/值構建您實際需要的表。但是,該表中缺少一些實體,例如'—',因此您可能需要爲所有可能的實體維護一個表。 – scoffey 2011-05-12 01:29:47

1

- 非破壞空間完全是UTF-8有效字符,允許d XML。

如果原始郵件包含它並轉換成要顯示在您的XML實體,指定要字符轉換爲XML,而不是HTML:

PHP 5.4.0+:

$encoded_value = htmlentities($value, ENT_COMPAT | ENT_XML1); 

在舊的PHP版本,默認的編碼是ISO-8859-1,所以指定UTF-8編碼爲:

$encoded_value = htmlentities($value, ENT_COMPAT | ENT_XML1, 'UTF-8'); 

注意:您可以使用html_entity_decode函數來獲取 - 從日電子郵件實體。