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

前端之家收集整理的这篇文章主要介绍了PHP解析xml格式数据工具类示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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


<div class="jb51code">
<pre class="brush:php;">
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,$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);
    }
    }
    }
@H_502_0@PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

@H_502_0@在线XML/JSON互相转换工具:

在线格式化XML/在线压缩XML:

@H_502_0@

XML

在线压缩/格式化工具:

XML

代码在线格式化美化工具:

@H_
502_0@更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》及《

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

猜你在找的PHP相关文章