SimpleXMLElement::addChild似乎对某些字符串不起作用


SimpleXMLElement::addChild doesn't seem to work with certain strings

在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;(单解码),它似乎可以将&映射到&amp;amp;开始。您的孩子最终在XML中使用&amp;,就像它应该的那样。

从外观上看,您可能需要使用htmlentities对制造商名称进行编码。这在CDATA标签中应该是可以的。

试试这个:

$values->addChild('marque', '<![CDATA['.htmlentities($product['manufacturer_name']).']]>');