2011-01-20 58 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编码数据传递是否可以接受?这将消除剥离任何东西的需要。