Home  >  Article  >  Backend Development  >  PHP parsing xml format data tool class example explanation

PHP parsing xml format data tool class example explanation

jacklove
jackloveOriginal
2018-07-03 17:45:191790browse

This article mainly introduces the PHP parsing xml format data tool class, involving PHP's related operation skills for adding, obtaining, and parsing xml format data nodes. Friends in need can refer to the following

The examples in this article are described PHP parsing xml format data tool class. Share it with everyone for your reference, the details are as follows:

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][&#39;tag&#39;];
      $value = isset($this->_struct[$i][&#39;value&#39;]) ? $this->_struct[$i][&#39;value&#39;] : &#39;&#39;;
      $attributes = isset($this->_struct[$i][&#39;attributes&#39;]) ? $this->_struct[$i][&#39;attributes&#39;] : &#39;&#39;;
      switch ($this->_struct[$i][&#39;type&#39;]) {
        case &#39;open&#39;:
          // 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 &#39;complete&#39;:
          // at end of current branch
          $children = $this->addNode($children, $tagname, $value, $attributes);
          break;
        case &#39;cdata&#39;:
          // node has CDATA after one of it&#39;s children
          $children[&#39;value&#39;] .= $value;
          break;
        case &#39;close&#39;:
          // 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 = &#39;&#39;, $attributes = &#39;&#39;, $child = &#39;&#39;) {
    if (!isset($target[$key][&#39;value&#39;]) && !isset($target[$key][0])) {
      if ($child != &#39;&#39;) {
        $target[$key] = $child;
      }
      if ($attributes != &#39;&#39;) {
        foreach ($attributes as $k => $v) {
          $target[$key][$k] = $v;
        }
      }
      $target[$key][&#39;value&#39;] = $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 != &#39;&#39;) {
        $target[$key][$index] = $child;
      }
      if ($attributes != &#39;&#39;) {
        foreach ($attributes as $k => $v) {
          $target[$key][$index][$k] = $v;
        }
      }
      $target[$key][$index][&#39;value&#39;] = $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: Here are several online tools for xml operations. For your reference:

OnlineXML/JSON mutual conversion tool:
http:// tools.jb51.net/code/xmljson

Online formattingXML/Online compressionXML
http://tools.jb51.net/code/xmlformat

XMLOnline compression/formatting tool:
http://tools.jb51.net/code/xml_format_compress

XML## Code online formatting and beautification tool:
http://tools.jb51.net/code/xmlcodeformat

Articles you may be interested in:

The difference between class static calls and range resolution operators in PHP

Detailed explanation of examples of stack and queue functions implemented by PHP based on arrays

Detailed explanation of error handling and exception handling methods based on PHP7

The above is the detailed content of PHP parsing xml format data tool class example explanation. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn