首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

PHP XML解析种

2012-12-23 
PHP XML解析类?php /*+----------------------------------+| SofeeFramework for PHP 4|+--------------

PHP XML解析类

<?php /*   +----------------------------------+   | SofeeFramework for PHP 4                                             |   +----------------------------------+   | Copyright (c) 2004-2005 Sofee Development Team.(http://www.sofee.cn) |   +----------------------------------+   | This source file is subject to version 1.00 of the Sofee license,    |   | that is bundled with this package in the file LICENSE, and is        |   | available through the world-wide-web at the following url:           |   | http://www.sofee.cn/license/1_00.txt.                                |   | If you did not receive a copy of the Sofee license and are unable to |   | obtain it through the world-wide-web, please send a note to          |   | license@sofee.cn so we can mail you a copy immediately.              |   +----------------------------------+   | Author: Justin Wu <ezdevelop@gmail.com>                              |   +----------------------------------+ */      /* $Id: SofeeXmlParser.php,v 1.3 2005/05/30 06:30:14 wenlong Exp $ */ /** * Sofee XML Parser class - This is an XML parser based on PHP's "xml" extension. * * The SofeeXmlParser class provides a very simple and easily usable toolset to convert XML  * to an array that can be processed with array iterators. * * @package        SofeeFramework * @access        public * @version        $Revision: 1.1 $ * @author        Justin Wu <wenlong@php.net> * @homepage        http://www.sofee.cn * @copyright    Copyright (c) 2004-2005 Sofee Development Team.(http://www.sofee.cn) * @since        2005-05-30 * @see            PEAR:XML_Parser | SimpleXML extension */ class SofeeXmlParser {          /**     * XML parser handle     *     * @var        resource     * @see        xml_parser_create()     */     var $parser;     /**     * source encoding     *     * @var        string     */     var $srcenc;     /**     * target encoding     *     * @var        string     */     var $dstenc;     /**     * the original struct     *     * @access    private     * @var        array     */     var $_struct = array();     /**     * Constructor     *     * @access        public     * @param        mixed        [$srcenc] source encoding     * @param        mixed        [$dstenc] target encoding     * @return        void     * @since             */     function SofeeXmlParser($srcenc = null, $dstenc = null) {         $this->srcenc = $srcenc;         $this->dstenc = $dstenc;                  // initialize the variable.         $this->parser = null;         $this->_struct = array();     }     /**     * Free the resources     *     * @access        public     * @return        void     **/     function free() {         if (isset($this->parser) && is_resource($this->parser)) {             xml_parser_free($this->parser);             unset($this->parser);         }     }     /**     * Parses the XML file     *     * @access        public     * @param        string        [$file] the XML file name     * @return        void     * @since             */     function parseFile($file) {         $data = @file_get_contents($file) or die("Can't open file $file for reading!");         $this->parseString($data);     }     /**     * Parses a string.     *     * @access        public     * @param        string        [$data] XML data     * @return        void     */     function parseString($data) {         if ($this->srcenc === null) {             $this->parser = @xml_parser_create() or die('Unable to create XML parser resource.');         } else {             $this->parser = @xml_parser_create($this->srcenc) or die('Unable to create XML parser resource with '. $this->srcenc .' encoding.');         }                  if ($this->dstenc !== null) {             @xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, $this->dstenc) or die('Invalid target encoding');         }         xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);    // lowercase tags         xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);        // skip empty tags         if (!xml_parse_into_struct($this->parser, $data, &$this->_struct)) {             printf("XML error: %s at line %d",                      xml_error_string(xml_get_error_code($this->parser)),                      xml_get_current_line_number($this->parser)             );             $this->free();             exit();         }                  $this->_count = count($this->_struct);         $this->free();     }     /**     * return the data struction     *     * @access        public     * @return        array     */     function getTree() {         $i = 0;         $tree = array();         $tree = $this->addNode(             $tree,              $this->_struct[$i]['tag'],              (isset($this->_struct[$i]['value'])) ? $this->_struct[$i]['value'] : '',              (isset($this->_struct[$i]['attributes'])) ? $this->_struct[$i]['attributes'] : '',              $this->getChild($i)         );         unset($this->_struct);         return ($tree);     }     /**     * recursion the children node data     *     * @access        public     * @param        integer        [$i] the last struct index     * @return        array     */     function getChild(&$i) {         // contain node data         $children = array();         // loop         while (++$i < $this->_count) {             // node tag name             $tagname = $this->_struct[$i]['tag'];             $value = isset($this->_struct[$i]['value']) ? $this->_struct[$i]['value'] : '';             $attributes = isset($this->_struct[$i]['attributes']) ? $this->_struct[$i]['attributes'] : '';             switch ($this->_struct[$i]['type']) {                 case 'open':                     // node has more children                     $child = $this->getChild($i);                     // append the children data to the current node                     $children = $this->addNode($children, $tagname, $value, $attributes, $child);                     break;                 case 'complete':                     // at end of current branch                     $children = $this->addNode($children, $tagname, $value, $attributes);                     break;                 case 'cdata':                     // node has CDATA after one of it's children                     $children['value'] .= $value;                     break;                 case 'close':                     // end of node, return collected data                      return $children;                     break;             }                  }         //return $children;     }     /**     * Appends some values to an array     *     * @access        public     * @param        array        [$target]     * @param        string        [$key]     * @param        string        [$value]     * @param        array        [$attributes]     * @param        array        [$inner] the children     * @return        void     * @since             */     function addNode($target, $key, $value = '', $attributes = '', $child = '') {         if (!isset($target[$key]['value']) && !isset($target[$key][0])) {             if ($child != '') {                 $target[$key] = $child;             }             if ($attributes != '') {                 foreach ($attributes as $k => $v) {                     $target[$key][$k] = $v;                 }             }                          $target[$key]['value'] = $value;         } else {             if (!isset($target[$key][0])) {                 // is string or other                 $oldvalue = $target[$key];                 $target[$key] = array();                 $target[$key][0] = $oldvalue;                 $index = 1;             } else {                 // is array                 $index = count($target[$key]);             }             if ($child != '') {                 $target[$key][$index] = $child;             }             if ($attributes != '') {                 foreach ($attributes as $k => $v) {                     $target[$key][$index][$k] = $v;                 }             }             $target[$key][$index]['value'] = $value;         }         return $target;     } }?>

?实例一 (解析XML文件):

<?php$file="http://dict.cn/ws.php?q=content";require_once('SofeeXmlParser.php');$xml = new SofeeXmlParser();$xml->parseFile($file); $tree = $xml->getTree();unset($xml);print "<pre>";foreach($tree as $val){echo $val['key']['value'];echo $val['lang']['value'];}print "</pre>";?>

实例二 (解析XML字符串):

<?php$str = '<?xml version="1.0" encoding="gb2312"?><root>  <info value="adevy">    <name>adevy001</name>    <sex>男</sex>  </info>  <info value="adevy">    <name>adevy001</name>    <sex>男</sex>  </info></root>';require_once('SofeeXmlParser.php');$xml = new SofeeXmlParser();$xml->parseString($str);$tree = $xml->getTree();unset($xml);print "<pre>";print_r($tree);print "</pre>";?> 
?

?

热点排行