Transformando um Objeto PHP em XML

Opa!!!! primeiro post!

Eu estava aqui num projeto em PHP, onde eu precisava gerar um conteúdo XML para dar um parse com um XSL. Meus dados vem em forma de objetos, Pois tenho minhas Classes DAOs, que me retornam os dados em objetos (VOs ou Value Objects). Bom, eu poderia apenas pegar esses objetos e e criar na raça, xml por xml! Ou então! criar um código genérico que interpretasse esse objeto, ou array.

Vamos ao código:

<?php
/*
* Autor: Gregui Shigunov
* Data: 05/09/2007
*
* Classe que converte um objeto em um XML
*
*/

class XmlUtils {

/**
* Cria um XML baseado na estrutura de um Objeto
*
* @param Object $obj
* @param boolean $attrDefault Propriedades do Objeto como TextNode ou Attribute
* @return String
*/

public static function toXml($obj, $attrDefault = true) {
$dom = new DOMDocument(’1.0′, ‘utf-8′);

print_r($obj);

if (is_object($obj)) {
$dom->appendChild(XmlUtils::object2Xml($obj, $dom, $attrDefault));
}

if (is_array($obj)) {
XmlUtils::array2Xml($obj, $dom, $dom, $attrDefault);
}
$out = $dom->saveXML();

return $out;
}

/**
* Cria um XML baseado na estrutura de um Objeto
*
* @param Array $array de objetos e/ou arrays
* @param DOMElement $elem Objeto DOMElement onde serão adicionados os nós
* @param DOMDocument $dom Documento pai do XML
*/

private static function array2Xml($array, &$elem, &$dom, $attrDefault = null) {
$i = 0;

for ($i = 0; $i < count($array); $i++) {
$value = $array[$i];

if (is_object($value)) {
$elem->appendChild(XmlUtils::object2Xml($value, $dom, $attrDefault));
} elseif (is_array($value)) {
$novoElem = $dom->createElement(”object”);
XmlUtils::array2Xml($value, $novoElem, $dom, $attrDefault);
$elem->appendChild($novoElem);
} else {
$elem->setAttribute(”val$i”, $value);
}
}
}

/**
* Retorna um DOMElement baseado na estrutura do Objeto
*
* @param Object $obj
* @param DOMDocument $dom
* @return DOMElement
*/

private static function object2Xml($obj, &$dom, $attrDefault = null) {
$vars = get_object_vars($obj);

if (get_class($obj) != “stdClass”) {
$elem = $dom->createElement( get_class($obj) );
} else {
$elem = $dom->createElement( “objeto” );
}

$i = 0;

foreach ($vars as $chave => $valor) {
if (is_object($valor)) {
$elem->appendChild(XmlUtils::object2Xml($valor, $dom, $attrDefault));
} elseif (is_array($valor)) {
XmlUtils::array2Xml($valor, $elem, $dom, $attrDefault);
} else {
if($attrDefault){
$elem->setAttribute($chave, $valor);
} else {
$elem2 = $dom->createElement($chave);
$elemText = $dom->createTextNode($valor);
$elem2->appendChild($elemText);
$elem->appendChild($elem2);

}

}
}

return $elem;
}
}
?>

Agora um código de exemplo de uso da classe:

<?php
include_once(”XmlUtils.php”);

class Usuario {
var $nome = null;
var $cidade = null;
var $estado = null;
var $mensagens = array();
}

$usr = new Usuario();
$usr->nome = “Gregui Shigunov”;
$usr->cidade = “Curitiba”;
$usr->estado = “PR”;

$msn = null;
$msn->titulo = “Convertendo Objeto para XML”;
$msn->texto = “Note que o objeto ‘msn’ não tem um tipo específico, “.
“e note que ‘usr’ é da classe ‘Usuario’”;

$msn->to = array();
$msn->to[0] = “Elaine Cristine”;
$msn->to[1] = “gregui@gmail.com”;
$msn->to[] = “http://gregui.wordpress.com”;

$usr->mensagens = $msn;

echo XmlUtils::toXml($usr, false);

?>

Executando o códito teremos:

<?xml version=”1.0″ encoding=”utf-8″?>
<Usuario>
<nome>Gregui Shigunov</nome>
<cidade>Curitiba</cidade>
<estado>PR</estado>
<objeto val0=”Elaine” val1=”gregui@gmail.com” val2=”http://gregui.wordpress.com“>
<titulo>
Convertendo Objeto para XML</titulo>
<texto>
Note que o objeto ‘msn’ não tem um tipo específico, e note que ‘usr’ é da classe ‘Usuario’</texto>
</objeto>
</Usuario>

Até mais!!!!

3 Respostas para “Transformando um Objeto PHP em XML”

  1. Elvis Fernandes Disse:

    Grande Gregui!

    Ótimo exemplo! Me ajudou muito!

    Só que eu tive que fazer umas modificações para adaptar às minhas necessidades … como o código é seu, gostaria de saber se posso postá-lo com as modificações e os devidos créditos no meu blog.

    Se quiser, eu mando com as modificações que eu fiz …

    Abraço!

    Elvis

  2. Gregui Shigunov Disse:

    Sem problemas!!!

  3. Rodrigo Disse:

    Olá,

    Estamos implementando o seu post porém não conseguimos converter um array. Gostaria de saber se tem modificações no código e se poderia me enviar.

    Grato

Deixe um comentário