Best XML Parser for PHP

Best XML Parser for PHP

Asked on December 24, 2018 in XML.
Add Comment


  • 3 Answer(s)

    XML parse for php:

    • SimpleXML takes the cake because at first it is an extension, written in C, and is very fast.
    • Second, the parsed document takes the form of a PHP object. So user can “query” like $root->myElement.
    Answered on December 24, 2018.
    Add Comment

    Here is the statement:

         XML Parser and SimpleXML is that the final is not a pull parser is the main difference between them. SimpleXML is built on top of the DOM extensions and will load the entire XML file into memory. Loading the current node into memory will done by XML Parser like XMLReader only. Define handlers for specific nodes which will get triggered when the Parser encounters it. Then it is faster and saves on memory. SimpleXml quite limiting in what it offers over DOM. We can switch between DOM and SimpleXml.

    Answered on December 24, 2018.
    Add Comment

    For quick and easy xml parsing when an extension is not available, the below function willl be useful:

    <?php
    /**
    * Convert XML to an Array
    *
    * @param string $XML
    * @return array
    */
    function XMLtoArray($XML)
    {
      $xml_parser = xml_parser_create();
      xml_parse_into_struct($xml_parser, $XML, $vals);
      xml_parser_free($xml_parser);
      // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
      $_tmp='';
      foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close') {
          if (isset($multi_key[$x_tag][$x_level]))
            $multi_key[$x_tag][$x_level]=1;
          else
            $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete') {
          if ($_tmp==$x_tag)
            $multi_key[$x_tag][$x_level]=1;
          $_tmp=$x_tag;
        }
      }
      // jedziemy po tablicy
      foreach ($vals as $xml_elem) {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
          $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
          $multi_key[$x_tag][$x_level]++;
        while ($start_level < $x_level) {
          $php_stmt .= '[$level['.$start_level.']]';
          if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
            $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
          $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) {
          if (!isset($multi_key2[$x_tag][$x_level]))
            $multi_key2[$x_tag][$x_level]=0;
          else
            $multi_key2[$x_tag][$x_level]++;
          $add='['.$multi_key2[$x_tag][$x_level].']';
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) {
          if ($x_type == 'open')
            $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
          else
            $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
          eval($php_stmt_main);
        }
        if (array_key_exists('attributes', $xml_elem)) {
          if (isset($xml_elem['value'])) {
            $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            eval($php_stmt_main);
          }
          foreach ($xml_elem['attributes'] as $key=>$value) {
            $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
            eval($php_stmt_att);
          }
        }
      }
      return $xml_array;
    }
    ?>
    
    Answered on December 24, 2018.
    Add Comment


  • Your Answer

    By posting your answer, you agree to the privacy policy and terms of service.