2017-02-20 3 views
1

У меня есть XML-файл, содержащий данные [CDATA []]. Как это:Изменить [CDATA []] на PHP? (XML)

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

Теперь я слышал, что я не могу изменить [CDATA []] данные или что они содержат некоторые специальные символы!. Но я больше не помню ... Вот почему я спрашиваю здесь.

Могу ли я изменить значения в! [CDATA []], и если да, то как?

Я просто хочу добавить что-то вроде «? = Dadc» по ссылке.

Edit: Моя структура XML-файл (Хотите изменить URL):

<?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, поэтому вам нужно будет преобразовать их в стандартные текстовые узлы.

Если у вас есть фрагмент JS или HTML в XML, его легче читать, если специальные символы, такие как <, не экранированы. И это то, что разделы 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> 
+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

0

К счастью да !, проверить это:

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

echo (string)$link; 

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

С уважением, Idir

+0

И как я могу изменить отверстие XML-файл, который содержит ссылки с [CDATA []]!? – Jan