Login   Register  
PHP Classes
elePHPant
Icontem

File: xml.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Mikael Göransson  >  Recursive array to XML  >  xml.php  >  Download  
File: xml.php
Role: Class source
Content type: text/plain
Description: Class file
Class: Recursive array to XML
Generate XML documents from nested arrays
Author: By
Last change: Added "php" after <?
Date: 6 years ago
Size: 9,323 bytes
 

Contents

Class file image Download
<?php
/**
 * This file contains the XML class, "xml"
 * Licensed under the BSD license
 * All credits to strangeways (http://www.strangeways.se/)
 * for letting this code out in the free where it belongs!
 *
 * Contributions made by:
 * Fredrik Carlbom <fredrik.carlbom@gmail.com>
 *
 * @author Mikael "Lilleman" Goransson <lilleman@strangeways.se>
 * @version 0.1
 * @package SW-CMS
 */

/**
 * XML class
 *
 * Contributions made by:
 * Fredrik Carlbom <fredrik.carlbom@gmail.com>
 *
 * @author Mikael "Lilleman" Goransson <lilleman@strangeways.se>
 * @version 0.1
 * @package SW-CMS
 * @subpackage xml
 */
class xml {

    
/**
     * Content as array
     *
     * @var arr
     */
    
var $array = array();

    
/**
     * Errors
     *
     * @var arr
     */
    
var $errors = array();

    
/**
     * The XML
     *
     * @var str
     */
    
var $XML '';

    
/**
     * XML Encoding
     *
     * @var str
     */
    
var $XMLEncoding 'ISO-8859-1';

    
/**
     * XML default indent char
     *
     * @var str
     */
    
var $XMLIndentChar ' ';

    
/**
     * XML number of indents per level
     *
     * @var int
     */
    
var $XMLIndentNum 4;

    
/**
     * XML Line Break
     *
     * @var str
     */
    
var $XMLLineBreak "\n";

    
/**
     * Sets if the values of each tag should be fixed for forbidden characters (like <> etc)
     *
     * @var bol
     */
    
var $XMLSafe true;

    
/**
     * XML Version
     *
     * @var str
     */
    
var $XMLVersion '1.0';

    
/**
     * Class constructor
     *
     * @return boolean
     * @access Public
     */
    
function xml() {
        return 
true;
    } 
// End of xml()

    /**
     * Generate tags recursive
     * (This is the magic XML-creator)
     *
     * @param arr $arr
     * @param int $lvl
     * @param int $prev_lvl - will be one less than lvl if this is the first row, else it'll be the same
     * @return str
     * @access Private
     */
    
function generateTag($arr,$lvl 0,$prev_lvl 0) {
        
$str '';

        foreach (
$arr as $key => $value) {
            if (
is_numeric($key)) {
                
// Numeric keys are not allowed, so we skip them and treat them as non associated arrays
                
if ($prev_lvl != $lvl) {
                    
$this->XML .= $this->XMLLineBreak;
                } 
// End of if ($prev_lvl != $lvl)
                
$this->XML .= $this->indent($lvl) . '<' $this->strToXMLKeySafe($value) . ' />' $this->XMLLineBreak;
                
$prev_lvl $lvl;
            } else { 
// End of if ($key == '0' && !isset($arr['1']))
                
if ($prev_lvl != $lvl) {
                    
$this->XML .= $this->XMLLineBreak;
                } 
// End of if ($prev_lvl != $lvl)
                
$this->XML .= $this->indent($lvl) . '<' $this->strToXMLKeySafe($key) . '>';

                if (
is_array($value))   $this->XML .= $this->generateTag($value,$lvl 1,$lvl);
                else                    
$this->XML .= $this->strToXMLSafe($value);

                
// Remove attributes from closing key
                
list($key) = explode(' ',$key);

                if (
is_array($value)) $this->XML .= $this->indent($lvl);
                
$this->XML .= '</' $this->strToXMLKeySafe($key) . '>' $this->XMLLineBreak;

                
$prev_lvl $lvl;
            } 
// End of else to if ($key == '0' && !isset($arr['1']))
        
// End of foreach ($arr as $key => $value)

        
return $str;
    } 
// End of generateTag()

    /**
     * Create an indent string
     *
     * @param int $num - number of indents
     * @return str
     * @access Private
     */
    
function indent($num) {
        
$str '';
        for (
$i 1$i <= ($this->XMLIndentNum * ($num)); $i++) {
            
$str .= $this->XMLIndentChar;
        } 
// End of for ($i = 1; $i <= ($this->XMLIndentNum * ($num)); $i++)

        
return $str;
    } 
// End of indent()

    /**
     * Generate XML from $this->array
     *
     * @param bol $xmlHead - if the XML head should be included
     * @return boolean
     * @access Private
     */
    
function generateXML($xmlHead true) {
        
$this->XML '';

        if (
$xmlHead$this->XML .= $this->getXMLHead();

        
$this->XML .= $this->generateTag($this->array);

        return 
true;
    } 
// End of generateXML()

    /**
     * Output XML Data
     *
     * @param str $method - Either "return" or "echo" - "return" will make the function return, "echo" will print it to screen with header 'n all
     * @param bol $xmlHead - if the XML head should be included
     * @access Public
     */
    
function outputXML($method 'return',$xmlHead true) {
        
$this->generateXML($xmlHead);

        if (
$method == 'return') {
            return 
$this->XML;
        } elseif (
$method == 'echo') { // End of if ($method == 'return')
            
header('Content-Type: text/xml');
            echo 
$this->XML;
            return 
true;
        } else { 
// End of elseif ($method == 'echo')
            
return false;
        } 
// End of elseif ($method == 'echo')
    
// End of outputXML()

    /**
     * Set the array of contents
     *
     * @param arr $arr
     * @return boolean
     * @access Public
     */
    
function setArray($arr) {
        
$this->array $arr;
        return 
true;
    } 
// End of setArray()

    /**
     * Set indent character
     *
     * @param str $str
     * @return boolean
     * @access Public
     */
    
function setIndentChar($str) {
        
$this->XMLIndentChar strval($str);
        return 
true;
    } 
// End of setIndentChar()

    /**
     * Set number of indents
     *
     * @param int $int
     * @return boolean
     * @access Public
     */
    
function setIndentNum($int) {
        
$this->XMLIndentNum intval($int);
        return 
true;
    } 
// End of setIndentNum()

    /**
     * Set XML line breaks
     *
     * @param str $str
     * @return boolean
     * @access Public
     */
    
function setLineBreak($str) {
        
$this->XMLLineBreak strval($str);
        return 
true;
    } 
// End of setLineBreak()

    /**
     * Set the line break to the default for Mac OS
     *
     * @return boolean
     * @access Public
     */
    
function setLineBreakForMacOS() {
        return 
$this->setLineBreak("\r");
    } 
// End of setLineBreakForMacOS()

    /**
     * Set the line break to the default for UNIX (and Linux)
     *
     * @return boolean
     * @access Public
     */
    
function setLineBreakForUNIX() {
        return 
$this->setLineBreak("\n");
    } 
// End of setLineBreakForUNIX()

    /**
     * Set the line break to the default for Microsoft Windows
     *
     * @return boolean
     * @access Public
     */
    
function setLineBreakForWindows() {
        return 
$this->setLineBreak("\r\n");
    } 
// End of setLineBreakForWindows()

    /**
     * Set XML Encoding
     *
     * @param str $str
     * @return boolean
     */
    
function setXMLEncoding($str) {
        
$this->XMLEncoding strval($str);
        return 
true;
    } 
// End of setXMLEncoding()

    /**
     * Gets the XML Head for use in XML output
     *
     * @return str
     * @access Private
     */
    
function getXMLHead() {
        return 
'<?xml version="' $this->XMLVersion '" encoding="' $this->XMLEncoding '"?>' $this->XMLLineBreak;
    } 
// End of setXMLHead();

    
function setXMLSafe($mode) {
        if (
is_bool($mode)) {
            
$this->XMLSafe $mode;
            return 
true;
        } else { 
// End of if (is_bool($mode))
            
return false;
        } 
// End of else to if (is_bool($mode))
    
// End of setXMLSafe()

    /**
     * Set XML Version (as a string)
     * example: "1.0"
     *
     * @param str $str
     * @return boolean
     * @access Public
     */
    
function setXMLVersion($str) {
        
$this->XMLVersion strval($str);
        return 
true;
    } 
// End of setXMLVersion()

    /**
     * String to XML Safe for key (tag) values
     *
     * @param str $str
     * @return str
     * @access Private
     */
    
function strToXMLKeySafe($str) {
        if (
is_numeric($str)) {
            
// Due to rules in $this->generateTag(), this should not happend, so just for safety
            
$str 'a' $str;
        } elseif (
is_numeric(substr($str,0,1))) { // End of if (is_numeric($str))
            
$str preg_replace("/^(\\d*)/","",$str);
        } 
// End of elseif (is_numeric(substr($str,0,1)))

        
return $str;
    } 
// End of strToXMLKeySafe()

    /**
     * String to XML Safe
     *
     * @param str $str
     * @return str
     * @access Private
     */
    
function strToXMLSafe($str) {
        if (
$this->XMLSafe) {
            
$searchArray    = array('<''>'"'"'"');
            
$replaceArray   = array('&lt;''&gt;''&apos;''&quot;');
            
$str str_replace($searchArray,$replaceArray,$str);
        } 
// End of if ($this->xmlSafe)

        
return $str;
    } 
// End of strToXMLSafe()

// End of class xml
?>