在prestashop的effiliation插件中,我找到了这段代码:
$values->addChild('marque', '<![CDATA['.$product['manufacturer_name'].']]>');
在$product['manufacturer_name']
时,我有Cyril & Nathalie Daniel
,输出为<![CDATA[Cyril
,
与正常情况相反:<![CDATA[Foo Bar]]>
SimpleXMLElement::addChild的第二个参数可以包含&
吗?我是否必须在制造商名称上使用一些htmlentities?
答案 0 :(得分:7)
我的问题描述为here:
请注意,尽管addChild()转义为“&lt;”和“&gt;”,它不会逃脱 &符“&amp;”。
提出的解决方案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]]>
答案 1 :(得分:1)
另一种可能性是要记住 SimpleXMLElement 正在进行双重解码 - 而不是将&
映射到&
(单解码),它似乎工作到只需将&
映射到&amp;
即可。您的孩子最终会在XML中使用&
。
答案 2 :(得分:-1)
您可能需要使用htmlentities对您的制造商名称进行编码。这应该是我想到的CDATA标签中的确定。
试试这个:
$values->addChild('marque', '<![CDATA['.htmlentities($product['manufacturer_name']).']]>');