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

Source for file XML.php

Documentation is available at XML.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. /**
  4.  * VersionControl_SVN_Info allows for XML formatted output. XML_Parser is used to
  5.  * manipulate that output.
  6.  *
  7.  * +----------------------------------------------------------------------+
  8.  * | This LICENSE is in the BSD license style.                            |
  9.  * | http://www.opensource.org/licenses/bsd-license.php                   |
  10.  * |                                                                      |
  11.  * | Redistribution and use in source and binary forms, with or without   |
  12.  * | modification, are permitted provided that the following conditions   |
  13.  * | are met:                                                             |
  14.  * |                                                                      |
  15.  * |  * Redistributions of source code must retain the above copyright    |
  16.  * |    notice, this list of conditions and the following disclaimer.     |
  17.  * |                                                                      |
  18.  * |  * Redistributions in binary form must reproduce the above           |
  19.  * |    copyright notice, this list of conditions and the following       |
  20.  * |    disclaimer in the documentation and/or other materials provided   |
  21.  * |    with the distribution.                                            |
  22.  * |                                                                      |
  23.  * |  * Neither the name of Clay Loveless nor the names of contributors   |
  24.  * |    may be used to endorse or promote products derived from this      |
  25.  * |    software without specific prior written permission.               |
  26.  * |                                                                      |
  27.  * | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  |
  28.  * | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT    |
  29.  * | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS    |
  30.  * | FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE      |
  31.  * | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,  |
  32.  * | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
  33.  * | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;     |
  34.  * | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER     |
  35.  * | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT   |
  36.  * | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN    |
  37.  * | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE      |
  38.  * | POSSIBILITY OF SUCH DAMAGE.                                          |
  39.  * +----------------------------------------------------------------------+
  40.  *
  41.  * PHP version 5
  42.  *
  43.  * @category  VersionControl
  44.  * @package   VersionControl_SVN
  45.  * @author    Alexander Opitz <opitz.alexander@gmail.com>
  46.  * @copyright 2012 Alexander Opitz
  47.  * @license   http://www.opensource.org/licenses/bsd-license.php BSD License
  48.  * @link      http://pear.php.net/package/VersionControl_SVN
  49.  */
  50.  
  51. require_once 'VersionControl/SVN/Parser/Exception.php';
  52.  
  53. /**
  54.  * Class VersionControl_SVN_Parser_Info - XML Parser for Subversion Info output
  55.  *
  56.  * @category VersionControl
  57.  * @package  VersionControl_SVN
  58.  * @author   Alexander Opitz <opitz.alexander@gmail.com>
  59.  * @license  http://www.opensource.org/licenses/bsd-license.php BSD License
  60.  * @version  0.5.1
  61.  * @link     http://pear.php.net/package/VersionControl_SVN
  62.  */
  63. {
  64.     /**
  65.      * @var array $xmlPathConfig The XML configuration (like a DTD).
  66.      */
  67.     protected $xmlPathConfig = array();
  68.  
  69.     /**
  70.      * Parses given xml by xmlPathConfig of this class.
  71.      *
  72.      * @param string $xml The XML as string.
  73.      *
  74.      * @return array The processed xml as array.
  75.      * @throws VersionControl_SVN_Parser_Exception If XML isn't parseable.
  76.      */
  77.     public function getParsed($xml)
  78.     {
  79.         $reader = new XMLReader();
  80.         $reader->xml($xml);
  81.         if (false === $reader{
  82.             throw new VersionControl_SVN_Parser_Exception(
  83.                 'Cannot instantiate XMLReader'
  84.             );
  85.         }
  86.         $data = self::getParsedBody(
  87.             $reader$this->xmlPathConfig
  88.         );
  89.         $reader->close();
  90.         return $data;
  91.     }
  92.  
  93.     /**
  94.      * Function to read out the xml body element.
  95.      *
  96.      * @param XMLReader $reader        Instance of the XMLReader.
  97.      * @param array     $xmlPathConfig Configuration for this XML file.
  98.      *
  99.      * @return array The data parsed from XML
  100.      * @throws VersionControl_SVN_Parser_Exception If XML doesn't match config.
  101.      */
  102.     protected static function getParsedBody(
  103.         XMLReader $readerarray $xmlPathConfig
  104.     {
  105.         $xmlBodyEntry = key($xmlPathConfig);
  106.         while ($reader->read()) {
  107.             if (XMLReader::ELEMENT === $reader->nodeType
  108.                 && $xmlBodyEntry === $reader->name
  109.             {
  110.                 return self::getParsedEntry(
  111.                     $reader$xmlBodyEntry$xmlPathConfig[$xmlBodyEntry]
  112.                 );
  113.             }
  114.         }
  115.         throw new VersionControl_SVN_Parser_Exception(
  116.             'XML ends before body end tag.'
  117.         );
  118.     }
  119.  
  120.     /**
  121.      * Function to read out the xml entry element.
  122.      *
  123.      * @param XMLReader $reader        Instance of the XMLReader.
  124.      * @param string    $xmlEntry      Name of the entry.
  125.      * @param array     $xmlPathConfig Configuration for this XML file.
  126.      *
  127.      * @return array The data parsed from XML
  128.      * @throws VersionControl_SVN_Parser_Exception If XML doesn't match config.
  129.      */
  130.     protected static function getParsedEntry(
  131.         XMLReader $reader$xmlEntryarray $xmlPathConfig
  132.     {
  133.         // @var array $data The array of entry data
  134.         $data = array();
  135.  
  136.         while ($reader->read()) {
  137.             if (XMLReader::ELEMENT === $reader->nodeType
  138.             {
  139.                 if (isset($xmlPathConfig['path'][$reader->name])) {
  140.                     $config $xmlPathConfig['path'][$reader->name];
  141.                     $elementData = self::getParsedElement(
  142.                         $reader,
  143.                         $reader->name,
  144.                         $config
  145.                     );
  146.                     if (isset($config['quantifier'])
  147.                         && ($config['quantifier'== '+'
  148.                         || $config['quantifier'== '*')
  149.                     {
  150.                         $data[$reader->name][$elementData;
  151.                     else {
  152.                         $data[$reader->name$elementData;
  153.                     }
  154.                 else {
  155.                     self::parseBlindEntry($reader$reader->name);
  156.                 }
  157.             }
  158.             if (XMLReader::END_ELEMENT === $reader->nodeType
  159.                 && $xmlEntry === $reader->name
  160.             {
  161.                 return $data;
  162.             }
  163.         }
  164.         throw new VersionControl_SVN_Parser_Exception(
  165.             'XML ends before entry end tag. 2'
  166.         );
  167.     }
  168.  
  169.     /**
  170.      * Function to read out the xml element.
  171.      *
  172.      * @param XMLReader $reader        Instance of the XMLReader.
  173.      * @param string    $xmlEntry      Name of the entry.
  174.      * @param array     $xmlPathConfig Configuration for this XML file.
  175.      *
  176.      * @return array The data parsed from XML
  177.      * @throws VersionControl_SVN_Parser_Exception If XML doesn't match config.
  178.      */
  179.     protected static function getParsedElement(
  180.         XMLReader $reader$xmlEntryarray $xmlPathConfig
  181.     {
  182.         // @var array $data The array of element data
  183.         $data = array();
  184.  
  185.         if (isset($xmlPathConfig['attribute'])) {
  186.             foreach($xmlPathConfig['attribute'as $attribute{
  187.                 $data[$attribute$reader->getAttribute($attribute);
  188.             }
  189.         }
  190.         if ($reader->isEmptyElement{
  191.             return $data;
  192.         }
  193.         if (isset($xmlPathConfig['config'])
  194.             && 'string' === $xmlPathConfig['config']
  195.         {
  196.             $data = self::getParsedString($reader$xmlEntry);
  197.         else {
  198.             $data array_merge(
  199.                 self::getParsedEntry($reader$xmlEntry$xmlPathConfig),
  200.                 $data
  201.             );
  202.         }
  203.         return $data;
  204.     }
  205.  
  206.     /**
  207.      * Function to read out a string from a XML entry.
  208.      *
  209.      * @param XMLReader $reader   Instance of the XMLReader.
  210.      * @param string    $xmlEntry Name of the entry.
  211.      *
  212.      * @return string The string which should be read.
  213.      * @throws VersionControl_SVN_Parser_Exception If XML doesn't match config.
  214.      */
  215.     protected static function getParsedString(
  216.         XMLReader $reader$xmlEntry
  217.     {
  218.         // @var string|null $data The text from an entry.
  219.         $data = null;
  220.  
  221.         if ($reader->isEmptyElement{
  222.             return $data;
  223.         }
  224.         while ($reader->read()) {
  225.             if (XMLReader::ELEMENT === $reader->nodeType
  226.             {
  227.                 self::parseBlindEntry($reader$reader->name);
  228.             }
  229.             if (XMLReader::TEXT === $reader->nodeType
  230.             {
  231.                 $data $reader->value;
  232.             }
  233.             if (XMLReader::END_ELEMENT === $reader->nodeType
  234.                 && $xmlEntry === $reader->name
  235.             {
  236.                 return $data;
  237.             }
  238.         }
  239.         throw new VersionControl_SVN_Parser_Exception(
  240.             'XML ends before entry end tag. 3'
  241.         );
  242.     }
  243.  
  244.     /**
  245.      * Function to read out all XML entries, which aren't configured.
  246.      *
  247.      * @param XMLReader $reader   Instance of the XMLReader.
  248.      * @param string    $xmlEntry Name of the entry.
  249.      *
  250.      * @return void 
  251.      * @throws VersionControl_SVN_Parser_Exception If XML doesn't match config.
  252.      */
  253.     protected static function parseBlindEntry(
  254.         XMLReader $reader$xmlEntry
  255.     {
  256.         if ($reader->isEmptyElement{
  257.             return;
  258.         }
  259.         while ($reader->read()) {
  260.             if (XMLReader::ELEMENT === $reader->nodeType
  261.             {
  262.                 self::parseBlindEntry($reader$reader->name);
  263.             }
  264.             if (XMLReader::END_ELEMENT === $reader->nodeType
  265.                 && $xmlEntry === $reader->name
  266.             {
  267.                 return;
  268.             }
  269.         }
  270.         throw new VersionControl_SVN_Parser_Exception(
  271.             'XML ends before entry end tag. 4'
  272.         );
  273.     }
  274. }
  275. ?>

Documentation generated on Sat, 09 Feb 2013 12:30:14 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.