网络编程
位置:首页>> 网络编程>> php编程>> PHP解析xml格式数据工具类示例

PHP解析xml格式数据工具类示例

作者:疯狂的代码-Fire  发布时间:2023-11-19 20:05:53 

标签:PHP,解析xml

本文实例讲述了PHP解析xml格式数据工具类。分享给大家供大家参考,具体如下:


class ome_xml {
 /**
 * xml资源
 *
 * @var    resource
 * @see    xml_parser_create()
 */
 public $parser;
 /**
 * 资源编码
 *
 * @var    string
 */
 public $srcenc;
 /**
 * target encoding
 *
 * @var    string
 */
 public $dstenc;
 /**
 * the original struct
 *
 * @access  private
 * @var    array
 */
 public $_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();
 }
 /**
 * Parses the XML file
 *
 * @access    public
 * @param    string    [$file] the XML file name
 * @return    void
 * @since
 */
 function xml2array($file) {
   //$this->SofeeXmlParser('utf-8');
 $data = file_get_contents($file);
   $this->parseString($data);
   return $this->getTree();
 }
 function xml3array($file){
 $data = file_get_contents($file);
 $this->parseString($data);
 return $this->_struct;
 }
 /**
 * Parses a string.
 *
 * @access    public
 * @param    string    data XML data
 * @return    void
 */
 function parseString($data) {
   if ($this->srcenc === null) {
     $this->parser = xml_parser_create();
   } else {
     if($this->parser = xml_parser_create($this->srcenc)) {
       return '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();
     return false;
   }
   $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;
 }
 /**
 * 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);
   }
 }
}

希望本文所述对大家PHP程序设计有所帮助。

来源:http://blog.csdn.net/u013219814/article/details/68962653

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com