Escrevendo CDATA usando SimpleXmlElement

Muitas vezes temos a necessidade de escrever XML. E uma forma simples de escrever XML com PHP, é usando a classe SimpleXmlElement.

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 SimpleXmlElementComplement
 * que estende a classe SimpleXMLElement
 */
class SimpleXmlElementComplement extends SimpleXMLElement {

    /**
     * Cria um método com nome addCData
     * Recebe dois paramêtros : $name e value
     * @param  string $name => Será o nome do nó
     * @return string $value => O valor atribuido
     */
    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 "SimpleXmlElementComplement.php";

//Instancia a Classe SimpleXmlElementComplement
$xml = new SimpleXmlElementComplement('<?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 <>");

//imprimos 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.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *