• 技术文章 >后端开发 >php教程

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

    jacklovejacklove2018-07-03 17:45:19原创820
    这篇文章主要介绍了PHP解析xml格式数据工具类,涉及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);
        }
      }
    }

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

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

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

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

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

    您可能感兴趣的文章:

    PHP中类静态调用和范围解析操作符之间的区别

    PHP基于数组实现的堆栈和队列功能示例详解

    基于PHP7错误处理与异常处理方法详解

    以上就是PHP解析xml格式数据工具类示例讲解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:PHP中类静态调用和范围解析操作符之间的区别 下一篇:php实现的微信分享到朋友圈并记录分享次数功能的讲解
    Web大前端开发直播班

    相关文章推荐

    • 哪位高手有SESSION用法和代码贴出来参考一上~多谢 • 海内学习PHP的资源站点有哪些 • 最近有点迷惘,还想请大家指导上学习的方法 • 关于discuz! 2.5的有关问题 • php 数组应用详解

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网