2017-02-20 98 views
1

我有一个包含![CDATA []]数据的XML文件。就像这样:在PHP中修改![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

对于SimpleXML也是如此。 CDATA节是一种特殊的文本节点。它们实际上是为了使嵌入式部件对人类更易读。 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(); 

输出:其中包含的链接与[CDATA []]

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

我试图编辑我的CDATA值只是获取和追加我的东西,但现在我的链接如下所示:https://drive.google.com/file/d/0BzLxINxZFzoveWR3Qi1XelFjM0E/view?usp=sharing 我知道你有正确的版本,我会实现像你一样。但是CDATA和'&'之间究竟有什么区别? – Jan

+1

对于某些使用DOM或SimpleXML API的调用者来说,在阅读水平上没有区别。他们应该读取与字符串完全相同的数据。不同之处在于序列化。 CDATA部分不需要转义,因此它们内部的片段对人类而言更具可读性。接收XML解析器没有区别。这里是一个小例子,显示了不同之处:https://eval.in/740419 – ThW

+0

如果我按照你的链接,我会得到“内部服务器错误”。所以,如果有'&'或''&''没有区别? - 链接将起作用或将被销毁? – Jan