Avatar billede phliplip Nybegynder
13. juni 2006 - 12:58 Der er 4 kommentarer og
1 løsning

XML2Array parser dør ved for meget data

Hej Eksperter!

Jeg bruger følgende XML2Array script:

----
<?
class ParseXML {
  function GetChildren($vals, &$i) {
    $children = array(); // Contains node data
    if(isset($vals[$i]['value'])) {
      $children['value'] = $vals[$i]['value'];
    }

    while(++$i < count($vals)) {
      // LowerCase keys
      $vals[$i]['tag'] = strtolower($vals[$i]['tag']);
      switch ($vals[$i]['type']) {
        case 'cdata':
          if(isset($children['value'])) {
            $children['value'] .= $vals[$i]['value'];
          } else {
            $children['value'] = $vals[$i]['value'];
          }
          break;
        case 'complete':
          if(isset($vals[$i]['attributes'])) {
            $children[$vals[$i]['tag']][]['attributes'] = $vals[$i]['attributes'];
            $index = count($children[$vals[$i]['tag']])-1;
            if(isset($vals[$i]['value'])) {
              $children[$vals[$i]['tag']][$index]['value'] = $vals[$i]['value'];
            } else {
              $children[$vals[$i]['tag']][$index]['value'] = '';
            }
          } else {
            if(isset($vals[$i]['value'])) {
              $children[$vals[$i]['tag']][]['value'] = $vals[$i]['value'];
            } else {
              $children[$vals[$i]['tag']][]['value'] = '';
            }
          }
          break;
        case 'open':
          if(isset($vals[$i]['attributes'])) {
            $children[$vals[$i]['tag']][]['attributes'] = $vals[$i]['attributes'];
            $index = count($children[$vals[$i]['tag']])-1;
            $children[$vals[$i]['tag']][$index] = array_merge($children[$vals[$i]['tag']][$index],$this->GetChildren($vals, $i));
          } else {
            $children[$vals[$i]['tag']][] = $this->GetChildren($vals, $i);
          }
          break;
        case 'close':
        return $children;
      }
    }
  }

  function GetXMLTree($xmlloc, $data = false) {
    if(!$data) {
      if(file_exists($xmlloc)) {
        $data = implode('', file($xmlloc));
      } else {
        if($fp = @fopen($xmlloc,'r')) {
          while(!feof($fp)) {
            $data = $data . fread($fp, 1024);
          }
          fclose($fp);
        }
      }
    }
    $parser = xml_parser_create('ISO-8859-1');
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    $success = xml_parse_into_struct($parser, $data, $vals, $index);
    if($success === 0) {
      return false;
    }
    xml_parser_free($parser);

    $tree = array();
    $i = 0;

    $vals[$i]['tag'] = strtolower($vals[$i]['tag']);
    if(isset($vals[$i]['attributes'])) {
      $tree[$vals[$i]['tag']][]['attributes'] = $vals[$i]['attributes'];
      $index = count($tree[$vals[$i]['tag']])-1;
      $tree[$vals[$i]['tag']][$index] =  array_merge($tree[$vals[$i]['tag']][$index], $this->GetChildren($vals, $i));
    } else {
      $tree[$vals[$i]['tag']][] = $this->GetChildren($vals, $i);
    }
    return $tree;
  }
}
?>
----

Men den dør ved for meget data.. ved ikke lige præcis hvor meget det drejer sig om..

Er der nogen der kan se nogen faldgruber jeg har overset? Eller har nogen idéer til hvad der kan gøre det..

Har sat set_time_limit(0); og den dør omkring 3. kald til GetChildren hvis der er for meget data, hvis ikke så fortsætter den lystigt!

Mvh. Philip Espersen
Avatar billede phliplip Nybegynder
13. juni 2006 - 13:18 #1
Jeg kan fortælle at mit Manchester XML fylder 21,0 KB og mit London XML fylder 436 KB.

Manchester XML kører den uden problemer
London XML dør den

Jeg har sat set_time_limit(0); og når den dør, så dør den ved 3. kald til GetChildren()..

XML'en er der ikke fejl i umiddelbart.

Får det fra Venere.com, som response på et request efter ledige hoteller i de byer.
Avatar billede phliplip Nybegynder
13. juni 2006 - 13:37 #2
London arrayet indeholder 13429 records
Og Manchester 616 records
Avatar billede phliplip Nybegynder
13. juni 2006 - 15:37 #3
Den dør pga. memory usage... nogen der kan optimere den XML-parser?
Avatar billede fangel Nybegynder
13. juni 2006 - 20:07 #4
Hvis du har PHP5 på din server kan du bruge SimpleXML eller DOM istedet.. de er indbygget i PHP5, og kræver derfor langt mindre hukommelse...

http://www.zend.com/php5/articles/php5-xmlphp.php
http://www.zend.com/php5/articles/php5-simplexml.php

-fangel
Avatar billede phliplip Nybegynder
16. juni 2006 - 14:38 #5
Hej Fangel!

Tak for svaret.. men løste problemet ved at skifte til PEAR's XML parser! Den var der dog også lidt probs med hvis jeg sendte mit XML som data i en string til functionen.. men da sendte fil-navnet i stedet og bad parseren om at hente dataene så virkede det finno ;) Så ved andre det!

/Phliplip
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester