在prestshop的关联插件中,我发现了以下代码:
$values->addChild('marque', '<![CDATA['.$product['manufacturer_name'].']]>');
当在$product['manufacturer_name']
时,我有Cyril & Nathalie Daniel
,输出为<![CDATA[Cyril
,与正常情况相反:<![CDATA[Foo Bar]]>
SimpleXMLElement::addChild的第二个参数可以包含&
吗?我必须在制造商名称上使用一些htmlentities吗?
我的问题描述如下:
注意,虽然addChild()转义了"<"answers">",但它并不转义& &
提出的解决方案php.net (htmlentities或htmlcspecialchars)不是一个很好的,所以我想出了什么salathe建议:
<?php
class SimpleXMLExtended extends SimpleXMLElement // http://coffeerings.posterous.com/php-simplexml-and-cdata
{
public function addCData($cdata_text)
{
$node= dom_import_simplexml($this);
$no = $node->ownerDocument;
$node->appendChild($no->createCDATASection($cdata_text));
}
}
而不是
$values->addChild('marque', '<![CDATA['.$product['manufacturer_name'].']]>');
使用:
$values->addChild('marque')->addCData($product['manufacturer_name']);
输出现在是<![CDATA[Cyril & Nathalie Daniel]]>
另一种可能性是记住SimpleXMLElement正在进行双解码-而不是将&
映射到&
(单解码),它似乎可以将&
映射到&amp;
开始。您的孩子最终在XML中使用&
,就像它应该的那样。
从外观上看,您可能需要使用htmlentities对制造商名称进行编码。这在CDATA标签中应该是可以的。
试试这个:
$values->addChild('marque', '<![CDATA['.htmlentities($product['manufacturer_name']).']]>');