2011-08-22 3 views
2

で動作するようには思えない、私はこのコードを発見しました:のSimpleXMLElement ::はaddChildはPrestaShopのためpluggin effiliationで特定の文字列

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

$product['manufacturer_name']で、私はCyril & Nathalie Daniel持って、出力が<![CDATA[Cyrilあり、通常の場合とは対照的に、 :<![CDATA[Foo Bar]]>

SimpleXMLElement::addChildの第二引数は&を含めることができますすることはできますか?私はメーカー名にいくつかのhtmlentitiesを使用する必要がありますか?

+2

http://stackoverflow.com/questions/6260224/how-to-write-cdata-using-simplexmlelementを参照してください。 – salathe

+0

@salatheこれはまさに正しいことです。しかし、私は支払われたモジュールを変更することになっていないので、私は素早く汚い修正を事前にしたいと思います。 –

+0

確かに速く、汚れた修正が、まだコードを変更しています。いずれにしても、これをどのように行うべきかを知っています。 – salathe

答えて

7

私の問題はhereに記載されている:

注意に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

メーカーの名前をhtmlentitiesでエンコードする必要があるかもしれません。これは私が思っていたCDATAタグの中で大丈夫でしょう。

これを試してみてください:

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

別の可能性は、のSimpleXMLElementがダブルデコードを行っていることを覚えておくことです - 代わりに&amp;(シングルデコード)へのマッピング&の、それだけで&amp;amp;&をマップするために動作するようですで開始する。あなたの子供は、XMLで&amp;となるはずです。

関連する問題