Bonjour,


Je voulais savoir si on peut afficher les nœuds d' un fichier XML , en le manipulant avec PHP, de telle façon à ce qu'un nœud se retrouve dans un autre si il contient une certaine valeur.

Exemple:
1er noeud

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<node>
 <id>10</id>
 <parent>50</parent>
</node>
2ème noeud

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
<node>
 <id>4</id>
 <parent>10</parent>
</node>
Donc si le 2ème nœud a comme valeur pour la balise <parent> 10 qui est identique à la balise <id> du 1er noeud, on va afficher cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
<node>
 <id>10</id>
 <parent>50</parent>
 <node>
  <id>4</id>
  <parent>10</parent>
 </node>
</node>
Voici le code que j'utilise pour "parser" le fichier XML :

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Fichier à analyser
$file = "Content.xml";
 
// Etat de la pile de parcours du document XML
$stack = array();
 
// Valeur d'un dernier élément lu
$globaldata ="";
 
	//Ouverture du noeud
	function startElement($parser, $name, $attrs){
		global $stack;		
		array_push($stack,$name);		
	}
 
	//Fermetur du noeud
	function endElement($parser, $name){
		global $stack;
		global $globaldata;
		print "<b>".$globaldata."</b></".$name."></div> ";
		array_pop($stack);
	}
 
	//Contenu du noeud
	function characterData($parser, $data){
		global $globaldata;
		$globaldata = $data;
	}
 
	// Fonction associée à l’événement de détection d'un appel d'entité externe
	function externalEntityRefHandler($parser,$openEntityNames,$base,$systemId,$publicId){
		if ($systemId){
			if (!list($parser, $fp) = new_xml_parser($systemId)){
				printf("Impossible d'ouvrir %s à %s\n",$openEntityNames,$systemId);
				return FALSE;
			}
			while ($data = fread($fp, 4096)){
				if (!xml_parse($parser, $data, feof($fp))){
					printf("Erreur XML : %s à la ligne %d lors du traitement de l'entité %s\n",
					xml_error_string(xml_get_error_code($parser)),xml_get_current_line_number($parser),
					$openEntityNames);
					xml_parser_free($parser);
					return FALSE;
				}
			}
			xml_parser_free($parser);
			return TRUE; 
		} 
		return FALSE;
	}
 
	// Fonction de création du parser et d'affectation
	// des fonctions aux gestionnaires d'événements
	function new_xml_parser($file){
		global $parser_file;
		//création du parseur
		$xml_parser = xml_parser_create();
		//Activation du respect de la casse du nom des éléments XML
		xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
		//Déclaration des fonctions à rattacher au gestionnaire d'événement
		xml_set_element_handler($xml_parser, "startElement", "endElement");//Début et Fin
		xml_set_character_data_handler($xml_parser, "characterData");//Contenu
		xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");
		//Ouverture du fichier
		if (!($fp = @fopen($file, "r"))) { 
			return FALSE; 
		}
		//Transformation du parseur en un tableau
		if (!is_array($parser_file)){ 
			settype($parser_file, "array");
		}
		$parser_file[$xml_parser] = $file;
		return array($xml_parser, $fp);
	}
 
	// Appel à la fonction de création et d'initialisation du parseur
	if (!(list($xml_parser, $fp) = new_xml_parser($file))){ 
		die("Impossible d'ouvrir le document XML");
	}
 
	// Traitement de la ressource XML
	while ($data = fread($fp, 4096))
	{
		if (!xml_parse($xml_parser, $data, feof($fp))){
			die(sprintf("Erreur XML : %s à la ligne %d\n",xml_error_string(xml_get_error_code($xml_parser)),
			xml_get_current_line_number($xml_parser)));
		}
	}
 
 
// Libération de la ressource associée au parser
xml_parser_free($xml_parser);

MERCI pour votre précieuse aide !