Version: 0.1
Type: Full Script
Category: Other
License: GNU General Public License
Description: This class parses a XML file into a data structure, which allows the programmer to retrieve the information captured from the file in a tree fashion.
<?php
//!-----------------------------------------------------------------
// @class SimpleXmlParser
// @desc Cria um parser que constri uma estrutura de dados
// a partir de um arquivo XML
// @author Marcos Pont
//!-----------------------------------------------------------------
class SimpleXmlParser
{
var $root; // @var root (object) Objecto XmlNode raiz da rvore XML
var $parser; // @var parser (resource) Objeto xml_parser criado
var $data; // @var data (string) Dados XML a serem interpretados pelo parser
var $vals; // @var vals (array) Vetor de valores capturados do arquivo XML
var $index; // @var index (array) Vetor de ndices da rvore XML
var $charset = "ISO-8859-1"; // @var charset (string) Conjunto de caracteres definido para a criao do parser XML
//!-----------------------------------------------------------------
// @function SimpleXmlParser::SimpleXmlParser
// @desc Construtor do XML Parser. Parseia o contedo XML.
// @access public
// @param fileName (string) Nome do arquivo XML a ser processado
// @param data (string) Dados XML, se fileName = ""
//!-----------------------------------------------------------------
function SimpleXmlParser($fileName='', $data='', $charset='') {
if ($data == "") {
if (!file_exists($fileName)) $this->_raiseError("Can't open file ".$fileName);
$this->data = implode("",file($fileName));
} else {
$this->data = $data;
}
$this->data = eregi_replace(">"."[[:space:]]+"."<","><",$this->data);
$this->charset = ($charset != '') ? $charset : $this->charset;
$this->_parseFile();
}
//!-----------------------------------------------------------------
// @function SimpleXmlParser::getRoot
// @desc Retorna a raiz da rvore XML criada pelo parser
// @access public
// @returns Raiz da rvore XML
//!-----------------------------------------------------------------
function getRoot() {
return $this->root;
}
//!-----------------------------------------------------------------
// @function SimpleXmlParser::_parseFile
// @desc Inicializa o parser XML, setando suas opes de
// configurao e executa a funo de interpretao
// do parser armazenando os resultados em uma estrutura
// de rvore
// @access private
//!-----------------------------------------------------------------
function _parseFile() {
$this->parser = xml_parser_create($this->charset);
xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->charset);
xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);
if (!@xml_parse_into_struct($this->parser,$this->data,&$this->vals,&$this->index)) {
$this->_raiseError("Error while parsing XML File: ".xml_error_string(xml_get_error_code($this->parser))." at line ".xml_get_current_line_number($this->parser));
}
xml_parser_free($this->parser);
$this->_buildRoot(0);
}
//!-----------------------------------------------------------------
// @function SimpleXmlParser::_buildRoot
// @desc Cria o apontador da raiz da rvore XML a partir
// do primeiro valor do vetor $this->vals. Inicia a
// execuo recursiva para montagem da rvore
// @access private
// @see PHP2Go::_getChildren
//!-----------------------------------------------------------------
function _buildRoot() {
$i = 0;
$this->root = new XmlNode($this->vals[$i]['tag'],
(isset($this->vals[$i]['attributes'])) ? $this->vals[$i]['attributes'] : NULL,
$this->_getChildren($this->vals, $i),
(isset($this->vals[$i]['value'])) ? $this->vals[$i]['value'] : NULL);
}
//!-----------------------------------------------------------------
// @function SimpleXmlParser::_getChildren
// @desc Funo recursiva para a montagem da rvore XML
// @access private
// @param vals (array) vetor de valores do arquivo
// @param i (int) ndice atual do vetor de valores
// @see PHP2Go::_getRoot
//!-----------------------------------------------------------------
function _getChildren($vals, &$i) {
$children = array();
while (++$i < sizeof($vals)) {
switch ($vals[$i]['type']) {
case 'cdata': array_push($children, $vals[$i]['value']);
break;
case 'complete': array_push($children, new XmlNode($vals[$i]['tag'], (isset($vals[$i]['attributes']) ? $vals[$i]['attributes'] : NULL), NULL, (isset($vals[$i]['value']) ? $vals[$i]['value'] : NULL)));
break;
case 'open': array_push($children, new XmlNode($vals[$i]['tag'], (isset($vals[$i]['attributes']) ? $vals[$i]['attributes'] : NULL), $this->_getChildren($vals, $i), (isset($vals[$i]['value']) ? $vals[$i]['value'] : NULL)));
break;
case 'close': return $children;
}
}
}
//!-----------------------------------------------------------------
// @function SimpleXmlParser::_raiseError
// @desc Tratamento de erros da classe
// @access private
// @param errorMsg (string) Mensagem de erro
//!-----------------------------------------------------------------
function _raiseError($errorMsg) {
trigger_error($errorMsg, E_USER_ERROR);
}
}
//!-----------------------------------------------------------------
// @class XmlNode
// @desc Cria um nodo de rvore XML
// @author Marcos Pont
//!-----------------------------------------------------------------
class XmlNode
{
var $tag; // @var tag (string) Tag correspondente ao nodo
var $attrs; // @var attrs (array) Vetor de atributos do nodo
var $children; // @var children (array) Vetor de filhos do Nodo
var $value; // @var value (mixed) Valor CDATA do nodo XML
//!-----------------------------------------------------------------
// @function XmlNode::XmlNode
// @desc Construtor do objeto XmlNode
// @access public
// @param nodeTag (string) Tag do nodo
// @param nodeAttrs (array) Vetor de atributos do nodo
// @param nodeChildren (array) Vetor de filhos do nodo, padro NULL
// @param nodeValue (mixed) Valor CDATA do nodo XML, padro NULL
//!-----------------------------------------------------------------
function XmlNode($nodeTag, $nodeAttrs, $nodeChildren=NULL, $nodeValue=NULL) {
$this->tag = $nodeTag;
$this->attrs = $nodeAttrs;
$this->children = $nodeChildren;
$this->value = $nodeValue;
}
}
?>