php教程

超轻量级php框架startmvc

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

更新时间:2020-03-26 02:00:29 作者:startmvc
本文实例讲述了PHP解析xml格式数据工具类。分享给大家供大家参考,具体如下:classome_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);
 }
 }
}

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线XML/JSON互相转换工具: http://tools.jb51.net/code/xmljson

在线格式化XML/在线压缩XMLhttp://tools.jb51.net/code/xmlformat

XML在线压缩/格式化工具: http://tools.jb51.net/code/xml_format_compress

XML代码在线格式化美化工具: http://tools.jb51.net/code/xmlcodeformat

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