SimpleXMLElement :: addChild似乎不适用于某些字符串

时间:2011-08-22 10:30:21

标签: php xml simplexml cdata

在prestashop的effiliation插件中,我找到了这段代码:

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

$product['manufacturer_name']时,我有Cyril & Nathalie Daniel,输出为<![CDATA[Cyril, 与正常情况相反:<![CDATA[Foo Bar]]>

SimpleXMLElement::addChild的第二个参数可以包含&吗?我是否必须在制造商名称上使用一些htmlentities?

3 个答案:

答案 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;(单解码),它似乎工作到只需将&映射到&amp;amp;即可。您的孩子最终会在XML中使用&amp;

答案 2 :(得分:-1)

您可能需要使用htmlentities对您的制造商名称进行编码。这应该是我想到的CDATA标签中的确定。

试试这个:

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