Parser un fichier XML avec DOM et XPATH en PHP

Fermé
wYm35 - 13 févr. 2013 à 21:51
 wYm35 - 14 févr. 2013 à 08:18
Bonjour a tous,
pour être franc j'ai TP que je doit rendre demain ^^, il faut que je parse un fichier XML avec des requêtes XPATH. Jusque là tout marche pour le mieux mais le problème est que si je sélectionne un node j'aimerais bien avoir ses fils dans un tableau indexé et non pas comme c'est dans l'attribut ['nodeValue'].
Merci pour votre éventuelle aide.
Voici mon code si ça peut vous aider :
$dom = new DOMDocument;
// Ignorer les espaces blancs
//$dom->preserveWhiteSpace = false;
$dom->Load('missions.xml');
$xpath = new DOMXPath($dom);
 
// Récupérer la liste des missions
$nodes = $xpath->query('/missions/mission');
foreach ($nodes as $i => $mission) {
    $missions[] = $mission;
}

Cordialement.
A voir également:

1 réponse

Bonjour a tous,
je pense que ce code ferra l'affaire :
<?php
// Tableau qui va acontenir les missisons
$missions = array();

// Création d'une représentation du document
$dom = new DOMDocument('1.0', 'UTF-8');

// Charger les balises XML depuis le fichier 'missions.xml'
$dom->Load('missions.xml');

// Création d'un nouvel objet DOMXPath
$xpath = new DOMXPath($dom);

// Récupérer le mois
$mois = $xpath->evaluate('/missions')->item(0)->getAttribute('mois');

if(isset($_GET['affichage']) && $_GET['affichage'] == 'chauffeur' && isset($_GET['chauffeur'])) {
	// Récupérer la liste des missions spécifique à un chauffeur
	$query = '/missions/mission'.'[chauffeur/@nom=\''.$_GET['chauffeur'].'\']';
} else {
	// Récupérer la liste de toutes les missions
	$query = '/missions/mission';
}
// Exécution de la requête XPath
$nodes = $xpath->query($query);
foreach ($nodes as $i => $mission) {
	// Indice utilisé pour les lieux
	$j = 0;
	// Distance total de chaque itineraire pour chaque mission
	$missions[$i]['distance_total'] = 0 ;
	// ID de la mission courante
	$missions[$i]['id'] = $mission->getAttribute('id');
	foreach ($mission->getElementsByTagName('*') as $key => $value) {
		if($value->nodeName == 'chauffeur') {
			// Si le node courant est 'chauffeur' on prend l'attribut nom
			$missions[$i]['chauffeur'] = $value->getAttribute('nom');
		} else if($value->nodeName == 'lieu') {
			/**
			 * Si le node courant est 'lieu' on crée un tableau indxé qui contient
			 * l'ensemble des valeurs concernant le lieu courant
			 **/
			$missions[$i]['distance_total'] += $value->getAttribute('distance');
			$missions[$i]['itineraire'][$j]['lieu']['distance'] = $value->getAttribute('distance');
			$missions[$i]['itineraire'][$j]['lieu']['typeLieu'] = $value->getAttribute('typeLieu');
			$missions[$i]['itineraire'][$j]['lieu']['nom'] = $value->nodeValue;
			$j ++;
		} else if($value->nodeName != 'itineraire') {
			// Sinon on prend la valeur textuelle du node
			$missions[$i][$value->nodeName] = $value->nodeValue;
		}
	}
} ?>
0