PEAR
[ class tree: PEAR ] [ index: PEAR ] [ all elements ]

Source for file XMLParser.php

Documentation is available at XMLParser.php

  1. <?php
  2. /**
  3.  * PEAR_XMLParser
  4.  *
  5.  * PHP versions 4 and 5
  6.  *
  7.  * @category   pear
  8.  * @package    PEAR
  9.  * @author     Greg Beaver <cellog@php.net>
  10.  * @author     Stephan Schmidt (original XML_Unserializer code)
  11.  * @copyright  1997-2009 The Authors
  12.  * @license   http://opensource.org/licenses/bsd-license New BSD License
  13.  * @version    CVS: $Id: XMLParser.php 313023 2011-07-06 19:17:11Z dufuz $
  14.  * @link       http://pear.php.net/package/PEAR
  15.  * @since      File available since Release 1.4.0a1
  16.  */
  17.  
  18. /**
  19.  * Parser for any xml file
  20.  * @category  pear
  21.  * @package   PEAR
  22.  * @author    Greg Beaver <cellog@php.net>
  23.  * @author    Stephan Schmidt (original XML_Unserializer code)
  24.  * @copyright 1997-2009 The Authors
  25.  * @license   http://opensource.org/licenses/bsd-license New BSD License
  26.  * @version   Release: 1.9.4
  27.  * @link      http://pear.php.net/package/PEAR
  28.  * @since     Class available since Release 1.4.0a1
  29.  */
  30. {
  31.     /**
  32.      * unserilialized data
  33.      * @var string $_serializedData 
  34.      */
  35.     var $_unserializedData = null;
  36.  
  37.     /**
  38.      * name of the root tag
  39.      * @var string $_root 
  40.      */
  41.     var $_root = null;
  42.  
  43.     /**
  44.      * stack for all data that is found
  45.      * @var array    $_dataStack 
  46.      */
  47.     var $_dataStack = array();
  48.  
  49.     /**
  50.      * stack for all values that are generated
  51.      * @var array    $_valStack 
  52.      */
  53.     var $_valStack = array();
  54.  
  55.     /**
  56.      * current tag depth
  57.      * @var int    $_depth 
  58.      */
  59.     var $_depth = 0;
  60.  
  61.     /**
  62.      * The XML encoding to use
  63.      * @var string $encoding 
  64.      */
  65.     var $encoding = 'ISO-8859-1';
  66.  
  67.     /**
  68.      * @return array 
  69.      */
  70.     function getData()
  71.     {
  72.         return $this->_unserializedData;
  73.     }
  74.  
  75.     /**
  76.      * @param string xml content
  77.      * @return true|PEAR_Error
  78.      */
  79.     function parse($data)
  80.     {
  81.         if (!extension_loaded('xml')) {
  82.             include_once 'PEAR.php';
  83.             return PEAR::raiseError("XML Extension not found"1);
  84.         }
  85.         $this->_dataStack =  $this->_valStack = array();
  86.         $this->_depth = 0;
  87.  
  88.         if (
  89.             strpos($data'encoding="UTF-8"')
  90.             || strpos($data'encoding="utf-8"')
  91.             || strpos($data"encoding='UTF-8'")
  92.             || strpos($data"encoding='utf-8'")
  93.         {
  94.             $this->encoding = 'UTF-8';
  95.         }
  96.  
  97.         if (version_compare(phpversion()'5.0.0''lt'&& $this->encoding == 'UTF-8'{
  98.             $data utf8_decode($data);
  99.             $this->encoding = 'ISO-8859-1';
  100.         }
  101.  
  102.         $xp xml_parser_create($this->encoding);
  103.         xml_parser_set_option($xpXML_OPTION_CASE_FOLDING0);
  104.         xml_set_object($xp$this);
  105.         xml_set_element_handler($xp'startHandler''endHandler');
  106.         xml_set_character_data_handler($xp'cdataHandler');
  107.         if (!xml_parse($xp$data)) {
  108.             $msg xml_error_string(xml_get_error_code($xp));
  109.             $line xml_get_current_line_number($xp);
  110.             xml_parser_free($xp);
  111.             include_once 'PEAR.php';
  112.             return PEAR::raiseError("XML Error: '$msg' on line '$line'"2);
  113.         }
  114.         xml_parser_free($xp);
  115.         return true;
  116.     }
  117.  
  118.     /**
  119.      * Start element handler for XML parser
  120.      *
  121.      * @access private
  122.      * @param  object $parser  XML parser object
  123.      * @param  string $element XML element
  124.      * @param  array  $attribs attributes of XML tag
  125.      * @return void 
  126.      */
  127.     function startHandler($parser$element$attribs)
  128.     {
  129.         $this->_depth++;
  130.         $this->_dataStack[$this->_depth= null;
  131.  
  132.         $val = array(
  133.             'name'         => $element,
  134.             'value'        => null,
  135.             'type'         => 'string',
  136.             'childrenKeys' => array(),
  137.             'aggregKeys'   => array()
  138.        );
  139.  
  140.         if (count($attribs> 0{
  141.             $val['children'= array();
  142.             $val['type''array';
  143.             $val['children']['attribs'$attribs;
  144.         }
  145.  
  146.         array_push($this->_valStack$val);
  147.     }
  148.  
  149.     /**
  150.      * post-process data
  151.      *
  152.      * @param string $data 
  153.      * @param string $element element name
  154.      */
  155.     function postProcess($data$element)
  156.     {
  157.         return trim($data);
  158.     }
  159.  
  160.     /**
  161.      * End element handler for XML parser
  162.      *
  163.      * @access private
  164.      * @param  object XML parser object
  165.      * @param  string 
  166.      * @return void 
  167.      */
  168.     function endHandler($parser$element)
  169.     {
  170.         $value array_pop($this->_valStack);
  171.         $data  $this->postProcess($this->_dataStack[$this->_depth]$element);
  172.  
  173.         // adjust type of the value
  174.         switch (strtolower($value['type'])) {
  175.             // unserialize an array
  176.             case 'array':
  177.                 if ($data !== ''{
  178.                     $value['children']['_content'$data;
  179.                 }
  180.  
  181.                 $value['value'= isset($value['children']$value['children': array();
  182.                 break;
  183.  
  184.             /*
  185.              * unserialize a null value
  186.              */
  187.             case 'null':
  188.                 $data = null;
  189.                 break;
  190.  
  191.             /*
  192.              * unserialize any scalar value
  193.              */
  194.             default:
  195.                 settype($data$value['type']);
  196.                 $value['value'$data;
  197.                 break;
  198.         }
  199.  
  200.         $parent array_pop($this->_valStack);
  201.         if ($parent === null{
  202.             $this->_unserializedData &$value['value'];
  203.             $this->_root &$value['name'];
  204.             return true;
  205.         }
  206.  
  207.         // parent has to be an array
  208.         if (!isset($parent['children']|| !is_array($parent['children'])) {
  209.             $parent['children'= array();
  210.             if ($parent['type'!= 'array'{
  211.                 $parent['type''array';
  212.             }
  213.         }
  214.  
  215.         if (!empty($value['name'])) {
  216.             // there already has been a tag with this name
  217.             if (in_array($value['name']$parent['childrenKeys'])) {
  218.                 // no aggregate has been created for this tag
  219.                 if (!in_array($value['name']$parent['aggregKeys'])) {
  220.                     if (isset($parent['children'][$value['name']])) {
  221.                         $parent['children'][$value['name']] = array($parent['children'][$value['name']]);
  222.                     else {
  223.                         $parent['children'][$value['name']] = array();
  224.                     }
  225.                     array_push($parent['aggregKeys']$value['name']);
  226.                 }
  227.                 array_push($parent['children'][$value['name']]$value['value']);
  228.             else {
  229.                 $parent['children'][$value['name']] &$value['value'];
  230.                 array_push($parent['childrenKeys']$value['name']);
  231.             }
  232.         else {
  233.             array_push($parent['children'],$value['value']);
  234.         }
  235.         array_push($this->_valStack$parent);
  236.  
  237.         $this->_depth--;
  238.     }
  239.  
  240.     /**
  241.      * Handler for character data
  242.      *
  243.      * @access private
  244.      * @param  object XML parser object
  245.      * @param  string CDATA
  246.      * @return void 
  247.      */
  248.     function cdataHandler($parser$cdata)
  249.     {
  250.         $this->_dataStack[$this->_depth.= $cdata;
  251.     }
  252. }

Documentation generated on Wed, 06 Jul 2011 23:31:44 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.