Bonjour,

J'ai fais un script pour parser un document xml en php avec la fonction simplexml_load_file...

Le script marche très bien, sauf que je dois parser de très gros fichiers de données, et là vu que simplexml_load_file charge tous le fichier en mémoire, ca fais boom !

Du coup on m'a conseillé d'utiliser xml_parser...

J'ai trouvé un exemple de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
<?php
$file = "data.xml";
$depth = array();
 
function startElement($parser, $name, $attrs) 
{
    global $depth;
    for ($i = 0; $i < $depth[$parser]; $i++) {
        echo "  ";
    }
    echo "$name\n";
    $depth[$parser]++;
}
 
function endElement($parser, $name) 
{
    global $depth;
    $depth[$parser]--;
}
 
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
 
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
?>
Mais je ne vois pas comment acceder aux noeuds xml de mon fichier...

Voici une partie de mon script d'origine :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
$xml = simplexml_load_file($source);
 
  foreach($xml->record as $doc)
  {
 
	$cle = $doc->controlfield;
 
 
	if($cle['tag']=="001")
	{
	  ....
	}
 
	foreach($doc->datafield as $field)
	{
 
	  $repEtiq[$x]=$field['tag'];		 	  	
	  foreach($field->subfield as $subfield)
	  {
		  $zone.=$subfield['code'];
                  ....
	  }
	}
        ......
  }
Comment faire pour adapter mon script avec xml_parser ?