2017-02-20 106 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