2011-01-20 52 views
2

我需要將XML文檔發送到SOAP Web服務(我沒有任何控制權)。我收到了一個錯誤,因爲文本包含HTML實體,所以我乾淨的文本字符串與html_entity_decode(),然後htmlspecialchars()之前,我的文本添加到SimpleXML的對象,像這樣:通過PHP清理XML文檔中的十六進制實體

if(!mb_detect_encoding($string, "UTF-8") == "UTF-8") { 
    $string = utf8_encode($string); 
} 
$string = htmlspecialchars(html_entity_decode($string, ENT_COMPAT, 'UTF-8'), ENT_COMPAT, 'UTF-8'); 
$xml->addChild('PROD_DESC', $string); 

但是,儘管它清除命名實體其形式爲©它不會對像á這樣的十六進制實體做任何事情,我所說的服務也不接受這些實體。

In this post我發現了一個可能的解決方案,但是當我將該字符串傳遞給整潔的cleanString函數時,我得到的字符串相同,但它不會觸及這些實體。

+2

[PHP的可能重複:使用的DomDocument每當我試着寫UTF-8寫入它的十六進制表示。 ](http://stackoverflow.com/questions/3575109/php-using-domdocument-whenever-i-try-to-write-utf-8-it-writes-the-hexadecimal-no) – Gordon 2011-01-20 15:59:31

+1

是的,對不起,我沒有看到那個。你在那裏做了一個很好的解釋。 – AJJ 2011-01-20 16:19:40

回答

2

數字實體由SimpleXML的添加,因爲你的XML文檔有沒有聲明的編碼:

// with declared encoding : 
$xml = simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><x></x>'); 
$xml->addChild('PROD_DESC', "à"); 
// result: <PROD_DESC>à</PROD_DESC> 

// without declared encoding : 
$xml = simplexml_load_string('<?xml version="1.0"?><x></x>'); 
$xml->addChild('PROD_DESC', "à"); 
// result: <PROD_DESC>&#xE0;</PROD_DESC> 
0

將字符串作爲base64編碼數據傳遞是否可以接受?這將消除剝離任何東西的需要。