通过PHP清理XML文档中的十六进制实体

时间:2011-01-20 15:20:02

标签: php html xml character-encoding

我需要将XML文档发送到SOAP Web服务(我没有任何控制权)。我收到错误是因为文本包含html实体,所以在我将文本添加到simpleXML对象之前,我用html_entity_decode()然后htmlspecialchars()清理文本字符串,如下所示:

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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

您是否可以将字符串作为base64编码数据传递?这将消除剥离任何东西的需要。