【发布时间】:2014-05-22 06:54:51
【问题描述】:
我正在使用 CakePHP 的Xml core library 在视图中生成 XML:
$xml = Xml::build($data, array('return' => 'domdocument'));
echo $xml->saveXML();
View 是从控制器提供的一个数组:
$this->set(
array(
'data' => array(
'root' => array(
array(
'@id' => 'A & B: OK',
'name' => 'C & D: OK',
'sub1' => array(
'@id' => 'E & F: OK',
'name' => 'G & H: OK',
'sub2' => array(
array(
'@id' => 'I & J: OK',
'name' => 'K & L: OK',
'sub3' => array(
'@id' => 'M & N: OK',
'name' => 'O & P: OK',
'sub4' => array(
'@id' => 'Q & R: OK',
'@' => 'S & T: ERROR',
),
),
),
),
),
),
),
),
)
);
不管出于什么原因,CakePHP 发出这样的内部调用:
$dom = new DOMDocument;
$key = 'sub4';
$childValue = 'S & T: ERROR';
$dom->createElement($key, $childValue);
... 触发 PHP 警告:
Warning (2): DOMDocument::createElement(): unterminated entity reference T [CORE\Cake\Utility\Xml.php, line 292
... 因为 (as documented),DOMDocument::createElement 不会转义值。但是,正如测试用例所示,它仅在某些节点中执行。
是我做错了什么还是我只是在 CakePHP 中遇到了一个错误?
【问题讨论】:
-
像
$dom->createElement($key, htmlspecialchars($childValue));这样的包装值就可以了 -
@Alliswell - 请再次阅读问题。这是一个 CakePHP 问题,我没有直接调用 DOM 函数,只是构建一个数组。而且我无法以这种方式修补 CakePHP 核心,因为有些元素已经被转义,而另一些则没有。 (有关其他详细信息,请参阅接受的答案。)
标签: php xml cakephp domdocument cakephp-2.2