SimpleXMLElement :: addChild не работает с определенными строками - PullRequest
2 голосов
/ 22 августа 2011

В плагине Effiliation для prestashop я нашел этот код:

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

когда в $product['manufacturer_name'], у меня есть Cyril & Nathalie Daniel, на выходе будет <![CDATA[Cyril, в отличие от обычного случая: <![CDATA[Foo Bar]]>

Может ли второй аргумент SimpleXMLElement :: addChild содержать &? Должен ли я использовать некоторые htmlentities на имя производителя?

Ответы [ 3 ]

7 голосов
/ 22 августа 2011

Моя проблема описана здесь :

Обратите внимание, что хотя addChild () экранирует "<" и ">", он не экранирует амперсанд и "&".


Предлагаемое решение 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 голос
/ 27 февраля 2014

Другая возможность - помнить, что SimpleXMLElement выполняет двойное декодирование - вместо сопоставления & с &amp; (одиночное декодирование), кажется, работает только отображение &до &amp;amp; для начала.Ваш ребенок заканчивает с &amp; в XML, как и должно быть.

0 голосов
/ 22 августа 2011

Возможно, вам понадобится закодировать название вашего производителя с htmlentities. Это должно быть хорошо в пределах тегов CDATA, которые я думал, хотя.

Попробуйте это:

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