sábado, 10 de março de 2012

Criando XML com XDom + DOMDocument no PHP5

Neste post, teremos um exemplo bem básico para criar uma estrutura em HTML usando a extensão DOM do PHP5 para geração de XML. Esta geração do XML foi encapsulada em uma classe XDom que está disponível no github.

Sempre que preciso criar um XML através do PHP, uso a DOM extension que já fornece as classes DOMDocument, Element e todas mais que implementam a especificação DOM disponível no W3C .

Porém as vezes quando o XML possui elementos com muitos atributos (que pode ser o caso de algumas estruturas HTML), o código começa a ficar grande e na minha opinião um pouco poluído.

Para melhorar um pouco a situação nos meus projetos pessoais acabei criando uma classe bem simples, mas bem simples mesmo. Portanto caso alguém queira criticar a simplicidade da classe e tiver idéias para contribuir, fique à vontade pois o código está disponível no github: https://github.com/adolfoweloy/xdom

Bom, então vamos direto ao assunto, que é o código em si:


O código abaixo é a implementação da classe que encapsula um pouco a complexidade do DOMDocument (ainda encapsula muito pouco - praticamente o principal aqui é encapsular o modo de definir os atributos de um elemento xml).


<?php

/**
* XDom: a simple facade for DOMDocument class from PHP
* The intent of this is to allow someone to write less code when dealing with XML Creation.
* XDom isn't dealing with XML reading. You can improve it if you want.
*/
class XDom {
private $doc = null;

/**
* private constructor to force user to use createDocument static method
*/
private function __construct($doc) {
$this->doc = $doc;
}

/**
* create an instance of XDom agregating it with an instance of DOMDocument.
* @return XDom
*/
public static function createDocument() {
$doc = new DOMDocument('1.0');
$dom = new XDom($doc);
return $dom;
}

/**
* creates an element that may have attributes represented with an associative array.
* @param string $name the name of the element
* @param array $attributes associative array with attribute name and attribute value respectively
* @return Element
*/
public function createElement($name, $attributes = array()) {
$el = $this->doc->createElement($name);
foreach ($attributes as $attr_name => $attr_value) {
$el->setAttribute($attr_name, $attr_value);
}
return $el;
}

/**
* append the $el to the DOMDocument encapsulated by XDom.
* @param Element $el the element to be appended within the document.
* @return void
*/
public function appendToDocument($el) {
$this->doc->appendChild($el);
}

/**
* appends an element inside another element.
* @param Element $el element that will receive another element to append
* @param Element $element_to_append element to be inserted within the first Element
* @return void
*/
public function appendChildTo($el, $element_to_append) {
$el->appendChild($element_to_append);
}

/**
* returns xml as string (as an HTML)
* @return string
*/
public function saveHTML() {
return $this->doc->saveHTML();
}

/**
* returns xml as string
* @return string
*/
public function saveXML() {
return $this->doc->saveXML();
}

}


Agora um exemplo de utilização:


<?php
require_once('xdom.php');

$xdom = XDOM::createDocument();
$dive = $xdom->createElement('div',
array(
'id' => 'minhadiv',
'class' => 'divExterna'));

$divi = $xdom->createElement('div',
array(
'id' => 'divInterna',
'style' => 'border: 1px solid black'));

$xdom->appendToDocument($dive);
$xdom->appendChildTo($dive, $divi);

echo $xdom->saveHTML();


Bom, através deste post, temos uma pequena documentação quanto ao propósito da classe bem como o próprio código.

Talvez possa ajudar alguém, quem sabe?


Referências

Nenhum comentário:

Postar um comentário