修改PHP中的[CDATA []]? (XML)

时间:2017-02-20 21:32:45

标签: php xml dom simplexml cdata

我有一个包含![CDATA []]数据的XML文件。像这样:

<link><![CDATA[https://google.de]]></link>

现在我听说我无法修改![CDATA []]数据或者它们包含一些特殊字符。但我不记得了...... 这就是我在这里问的原因。

我可以更改![CDATA []]中的值,如果是,怎么更改?

我只想在链接上添加“?= dadc”之类的内容。

修改 我的XML文件结构(想要编辑网址):

<?xml version="1.0" encoding="UTF-8"?>
    <rss>
      <channel xmlns:g="http://base.google.com/ns/1.0" version="2.0">
        <title>Google Eur English 1</title>
        <description/>
        <item>
          <title>Anno 2070</title>
          <g:image_link><![CDATA[http://cdn.kinguin.net/media/catalog/category/anno_8.jpg]]></g:image_link>
          <url><![CDATA[http://www.kinguin.net/category/4/anno-2070/?nosalesbooster=1&country_store=1&currency=EUR]]></url>
          <price><![CDATA[3.88 EUR]]></price>
          <platform>Uplay</platform>
        </item>
      </channel>
    </rss>

问候

2 个答案:

答案 0 :(得分:3)

SimpleXML也是如此。 CDATA Sections是一种特殊的文本节点。它们实际上是为了使嵌入式部件对人类更具可读性。 SimpleXML并不真正处理XML节点,因此您必须让它们将它们转换为标准文本节点。

如果您在XML中有JS或HTML片段,那么如果不转义<这样的特殊字符,则更容易阅读。这就是CDATA部分的用途(以及浏览器的一些向后兼容性)。

因此,要修改CDATA部分并保留它,您必须使用DOM。 DOM实际上知道不同的节点类型。这是一个小例子:

$xml = '<link><![CDATA[https://google.de]]></link>';

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('//link/text()') as $linkValue) {
  $linkValue->data .= '?abc';
}
echo $document->saveXml();

输出:

<?xml version="1.0"?>
<link><![CDATA[https://google.de?abc]]></link>

答案 1 :(得分:0)

幸运的是!,检查一下:

$link = simplexml_load_string(
    '<link><![CDATA[Hello, world!]]></link>'
);

echo (string)$link;

PHP: How to handle <![CDATA[ with SimpleXMLElement?

此致 IDIR