home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / XML / Parser.php next >
PHP Script  |  2001-01-10  |  6KB  |  218 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.02 of the PHP license,      |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Stig Bakken <ssb@fast.no>                                   |
  17. // |                                                                      |
  18. // +----------------------------------------------------------------------+
  19. //
  20.  
  21. require_once "PEAR.php";
  22.  
  23. /*
  24.  
  25. Tests that need to be made:
  26. - error class
  27. - mixing character encodings
  28. - a test using all expat handlers
  29. - options (folding, output charset)
  30. - different parsing modes
  31.  
  32. */
  33.  
  34. /**
  35.  * XML Parser class.  This is an XML parser based on PHP's "xml" extension,
  36.  * based on the bundled expat library.
  37.  *
  38.  * @author Stig Bakken <ssb@fast.no>
  39.  *
  40.  */
  41. class XML_Parser extends PEAR {
  42.     // {{{ properties
  43.  
  44.     var $parser;
  45.     var $fp;
  46.     var $folding = true;
  47.     var $mode;
  48.  
  49.     // }}}
  50.     // {{{ constructor()
  51.  
  52.     function XML_Parser($charset = 'UTF-8', $mode = "event") {
  53.     $this->PEAR();
  54.     $xp = @xml_parser_create($charset);
  55.     if (is_resource($xp)) {
  56.         $this->parser = $xp;
  57.         $this->setMode($mode);
  58.         xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING,
  59.                   $this->folding);
  60.     }
  61.     }
  62.  
  63.     // }}}
  64.  
  65.     // {{{ setMode()
  66.  
  67.     function setMode($mode) {
  68.     $this->mode = $mode;
  69.     $xp = $this->parser;
  70.     xml_set_object($xp, $this);
  71.     switch ($mode) {
  72.         case "func":
  73.         xml_set_element_handler($xp, "funcStartHandler", "funcEndHandler");
  74.         break;
  75.         case "event":
  76.         if (method_exists($this, "startHandler") ||
  77.             method_exists($this, "endHandler")) {
  78.             xml_set_element_handler($xp, "startHandler", "endHandler");
  79.         }
  80.     }
  81.     if (method_exists($this, "cdataHandler")) {
  82.         xml_set_character_data_handler($xp, "cdataHandler");
  83.     } else {
  84.         xml_set_character_data_handler($xp, "");
  85.     }
  86.     if (method_exists($this, "defaultHandler")) {
  87.         xml_set_default_handler($xp, "defaultHandler");
  88.     } else {
  89.         xml_set_default_handler($xp, "");
  90.     }
  91.     if (method_exists($this, "piHandler")) {
  92.         xml_set_processing_instruction_handler($xp, "piHandler");
  93.     } else {
  94.         xml_set_processing_instruction_handler($xp, "");
  95.     }
  96.     if (method_exists($this, "unparsedHandler")) {
  97.         xml_set_unparsed_entity_decl_handler($xp, "unparsedHandler");
  98.     } else {
  99.         xml_set_unparsed_entity_decl_handler($xp, "");
  100.     }
  101.     if (method_exists($this, "notationHandler")) {
  102.         xml_set_notation_decl_handler($xp, "notationHandler");
  103.     } else {
  104.         xml_set_notation_decl_handler($xp, "");
  105.     }
  106.     if (method_exists($this, "entityrefHandler")) {
  107.         xml_set_external_entity_ref_handler($xp, "entityrefHandler");
  108.     } else {
  109.         xml_set_external_entity_ref_handler($xp, "");
  110.     }
  111.     }
  112.  
  113.     // }}}
  114.     // {{{ setInputFile()
  115.  
  116.     function setInputFile($file) {
  117.     $fp = @fopen($file, "r");
  118.     if (is_resource($fp)) {
  119.         $this->fp = $fp;
  120.         return $fp;
  121.     }
  122.     return new XML_Parser_Error($php_errormsg);
  123.     }
  124.  
  125.     // }}}
  126.     // {{{ setInput()
  127.  
  128.     function setInput($fp) {
  129.     if (is_resource($fp)) {
  130.         $this->fp = $fp;
  131.         return true;
  132.     }
  133.     return new XML_Parser_Error("not a file resource");
  134.     }
  135.  
  136.     // }}}
  137.     // {{{ parse()
  138.  
  139.     function parse() {
  140.     if (!is_resource($this->fp)) {
  141.         return new XML_Parser_Error("no input");
  142.     }
  143.     if (!is_resource($this->parser)) {
  144.         return new XML_Parser_Error("no parser");
  145.     }
  146.     while ($data = fread($this->fp, 2048)) {
  147.         $err = $this->parseString($data, feof($this->fp));
  148.         if (PEAR::isError($err)) {
  149.         return $err;
  150.         }
  151.     }
  152.     return true;
  153.     }
  154.  
  155.     // }}}
  156.     // {{{ parseString()
  157.  
  158.     function parseString($data, $eof = false) {
  159.     if (!is_resource($this->parser)) {
  160.         return new XML_Parser_Error("no parser");
  161.     }
  162.     if (!xml_parse($this->parser, $data, $eof)) {
  163.         $err = new XML_Parser_Error($this->parser);
  164.         xml_parser_free($this->parser);
  165.         return $err;
  166.     }
  167.     return true;
  168.     }
  169.  
  170.     // }}}
  171.     // {{{ funcStartHandler()
  172.  
  173.     function funcStartHandler($xp, $elem, $attribs) {
  174.     if (method_exists($this, $elem)) {
  175.         call_user_method($elem, $this, $xp, $elem, &$attribs);
  176.     }
  177.     }
  178.  
  179.     // }}}
  180.     // {{{ funcEndHandler()
  181.  
  182.     function funcEndHandler($xp, $elem) {
  183.     $func = $elem . '_';
  184.     if (method_exists($this, $func)) {
  185.         call_user_method($func, $this, $xp, $elem);
  186.     }
  187.     }
  188.  
  189.     // }}}
  190. }
  191.  
  192. class XML_Parser_Error extends PEAR_Error {
  193.     // {{{ properties
  194.  
  195.     var $error_message_prefix = 'XML_Parser: ';
  196.  
  197.     // }}}
  198.     // {{{ constructor()
  199.  
  200.     function XML_Parser_Error($msgorparser = 'unknown error',
  201.                   $code = 0,
  202.                   $mode = PEAR_ERROR_RETURN,
  203.                   $level = E_USER_NOTICE) {
  204.     if (is_resource($msgorparser)) {
  205.         $code = xml_get_error_code($msgorparser);
  206.         $msgorparser =
  207.         sprintf("%s at XML input line %d",
  208.             xml_error_string(xml_get_error_code($msgorparser)),
  209.             xml_get_current_line_number($msgorparser));
  210.     }
  211.     $this->PEAR_Error($msgorparser, $code, $mode, $level);
  212.     }
  213.  
  214.     // }}}
  215. }
  216.  
  217. ?>
  218.