【问题标题】:SimpleXMLElement::addChild doesn't seem to work with certain stringsSimpleXMLElement::addChild 似乎不适用于某些字符串
【发布时间】:2011-11-01 01:08:47
【问题描述】:

在 prestashop 的 effiliation 插件中,我找到了以下代码:

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

当在$product['manufacturer_name'],我有Cyril &amp; Nathalie Daniel,输出是&lt;![CDATA[Cyril, 与正常情况相反:&lt;![CDATA[Foo Bar]]&gt;

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

【问题讨论】:

  • @salathe 这确实是正确的做法。但我不应该修改付费模块,所以我会阻止快速的肮脏修复。
  • 当然,一个快速而肮脏的修复仍在修改代码。不管怎样,你知道应该怎么做。

标签: php xml simplexml cdata


【解决方案1】:

我的问题描述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']);

现在的输出是&lt;![CDATA[Cyril &amp; Nathalie Daniel]]&gt;

【讨论】:

    【解决方案2】:

    另一种可能性是记住 SimpleXMLElement 正在执行双重解码——而不是将&amp;amp;amp; 映射到&amp;amp;amp;(单解码),它似乎只映射@987654323 @ 到 &amp;amp;amp; 开始。您的孩子最终会在 XML 中得到应有的 &amp;amp;amp;

    【讨论】:

      【解决方案3】:

      您可能需要根据外观使用 htmlentities 对制造商名称进行编码。这在我认为的 CDATA 标记中应该没问题。

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        相关资源
        最近更新 更多