Muitas vezes temos a necessidade de escrever XML. E uma forma simples de escrever XML com PHP, é usando a classe SimpleXmlElement.
A classe SimpleXMLElement
é uma classe do PHP que permite a manipulação de dados XML. Ela faz parte da extensão SimpleXML, que é uma das extensões nativas do PHP para trabalhar com XML.
Mas ela não tem um método que adicionar o CData no XML.
O CData seriam dados de caracteres. É uma sintaxe onde você informa que o conteúdo daquela tag terá elementos especiais, como acentuação, sinal de maior (>) ou menor (<), etc.
O que iremos fazer, é estender a classe SimpleXmlElement e adicionar um novo método chamado addCData, o qual ele irá adicionar um no no XML, com Cdata.
<?php
/**
* Cria a classe SimpleXmlElementCData
* que estende a classe SimpleXMLElement
*/
class SimpleXmlElementCData extends \SimpleXMLElement {
/**
* Cria um método com nome addCData
* Recebe dois parâmetros : $name e value
* @param string $name => Será o nome do nó
* @return string $value => O valor atribuído
*/
public function addCData($name, $value = null) {
/**
* Criamos aqui um nó, usando
* o método addChild do SimpleXMLElement
*/
$child = $this->addChild($name);
/**
* Aqui Importamos o Nó do SimpleXMLElement
* para um DOMElement
*/
$node = dom_import_simplexml($child);
/**
* ownerDocument => Informamos que DomElement está associado a esse nó que criamos
* createCDATASection => adiciona o conteúdo CData
*/
$cdata = $node->ownerDocument->createCDATASection($value);
//Adicionar $cdata ao novo nó
$node->appendChild($cdata);
}
}
Agora, vamos usar essa classe:
<?php
//Informamos que tipo de conteudo será um XML
header('Content-type:text/xml');
//Inclue a classe que criamos
require_once "SimpleXmlElementCData.php";
//Instancia a Classe SimpleXmlElementCData
$xml = new SimpleXmlElementCData('<?xml version="1.0" encoding="UTF-8"?><products/>');
//Adiciono um nó (produto)
$product = $xml->addChild('product');
//Dentro do nó produto, adicionamos o Nome do Produto
$product->addChild('name', 'Novo Produto');
//Aqui a descrição com método que Criamos, e adicionando os caracteres
$product->addCData('description', "Aqui contém os caracters & e <>");
//imprimimos o XML
echo $xml->asXML();
E retorno será:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<name>Novo Produto</name>
<description><![CDATA[Esse tem tag & and <>]]></description>
</product>
</products>
Espero que tenha ajudado e até a próxima. Abraços a todos.