Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/10/2007, 17h39   #1
Invité régulier
 
Inscription : octobre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 15
Points : 6
Points : 6
Par défaut [DOM] Suppression d'un élément d'un sitemap

Bonjour à tous,

Ceci est mon premier post, donc soyez indulgent à moi

En fait, je suis en train de réaliser un sitemap totalement dynamique permettant de pouvoir l'afficher et d'ajouter des pages (donc des entrées dans mon xml) en cliquant sur un lien.

D'un point de Intégration tout est en ordre. Là ou je bloque, vous vous en doutez, c'est pour faire tourner tout cela

Alors voici mon code
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
	if(!empty($_GET['delete']) && is_numeric($_GET['delete'])) {
		$x = new DomDocument('1.0', 'iso-8859-1');
		$x->load(XML);
		$items = $x->getElementsByTagName('sitemap');
		$item = $items->item(0);
		$xp = new DomXPath($x);
		$del = $xp->query("//item[@id=".$_GET['delete']."]");
		$item->removeChild($del);
		$x->save(XML);
	}
Donc voilà j'aimerais pouvoir trouver un élement 'item' quelque soit son niveau hierarchique qui possède un attribut 'id' (attribut unique) pour pouvoir le supprimer. Son id est passé en paramètre ($_GET['delete]).

Mon XML ressemble en quelque sorte à ça
Code :
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="iso-8859-1"?>
<sitemap>
  <text>Si vous êtes perdu ou si vous cherchez une page spécifique, bienvenue sur le &lt;strong&gt;sitemap&lt;/strong&gt;</text>
  <liste> 
    <item id="1">item 1
    <liste>
      <item id="2">item 1.1</item>
        <item id="3">item 1.2</item>
        <item id="4">item 1.3        
       	  <liste>
            <item id="18">item 1.1</item>
Comme vous pouvez le voir, j'ai des éléments item à n'importe quel niveau.

Je remercie celui (ou celle) qui m'aidera parce que là je sius complètement perdue.

Merci beaucoup d'avance.
Ptite Pupuce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 19h14   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est un peu près ça, la méthode query renvoyant un objet DomNodeList et non un DomNode :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
if (!empty($_GET['delete']) && is_numeric($_GET['delete'])) {
    $x = DomDocument::load(XML);
    $xp = new DomXPath($x);
    $del = $xp->query('//item[@id="' . $_GET['delete'] . '"]');
    if ($del->length == 1) {
        $item = $del->item(0);
        $item->parentNode->removeChild($item);
        $x->save(XML);
    } else {
        // die('Erreur ?');
    }
}
(non testé)

Voir également la FAQ : Comment supprimer les noeuds correspondant à une expression XPath en PHP5 ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 22h39   #3
Invité régulier
 
Inscription : octobre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 15
Points : 6
Points : 6
Par défaut Merci

C'est parfait julp, maintenant je m'attaque à l'ajout à un endroit précis.

En fait je passe en paramètre l'id du noeud et l'emplacement (en haut ou en bas).

Voici mon code pour l'ajout
Code :
1
2
3
4
5
6
7
8
9
 
$x = DomDocument::load(XML);
$xp = new DomXPath($x);
$add = $xp->query("//item[@id=".$_GET['id']."]");
$item = $add->item(0);
$item->parentNode->appendChild($item);
$user = $x->createElement('item');
$user->setAttribute('id', $new_id);
$item->appendChild($user);
Là ce que j'aimerais ce serait créer un élement en dessous de celui passé en pramètre, juste en dessous au même niveau hierachique pas comme nouvel enfant de celui-ci.

Merci encore.
Ptite Pupuce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 22h51   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Il n'y a pas de méthode toute faite pour une insertion après, il faut donc utiliser la méthode d'insertion avant (insertBefore) après s'être déplacé dans l'arbre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$x = DomDocument::load(XML);
$xp = new DomXPath($x);
$add = $xp->query('//item[@id="'.$_GET['id'].'"]');
$item = $add->item(0);
// Création du nouvel élément
$user = $x->createElement('item');
$user->setAttribute('id', $new_id);
// Insertion dans l'arbre après le noeud de référence
if ($item->nextSibling) {
    // Si le noeud référent possède un frère
    $item->parentNode->insertBefore($user, $item->nextSibling);
} else {
    // Si le noeud référent ne possède pas de frère
    $item->parentNode->appendChild($user);
}
(non testé)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 23h24   #5
Invité régulier
 
Inscription : octobre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 15
Points : 6
Points : 6
C'est parfait julp,

Ceci dit lorsque je teste ton code, cela permet d'ajouter un élement après l'élément référencé et non pas avant comme tu le soutiens.

Aurais-tu une solution pour mon problème ?

Je te remercie
Ptite Pupuce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 23h42   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Ptite Pupuce
Ceci dit lorsque je teste ton code, cela permet d'ajouter un élement après l'élément référencé et non pas avant comme tu le soutiens.
Ce n'est ni ce que j'ai écrit ni codé conformément à votre précédente demande
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 23h48   #7
Invité régulier
 
Inscription : octobre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 15
Points : 6
Points : 6
Je ne comprends pas vraiment ce dont il s'agit pour l'instant mais je vais réitérer ma demande.

Serait-il possible de créer l'élément avant le noeud passé en référence parce que lorsque j'utilise la solution précédente ((avec nextSibling) cela me rajoutte le noeud après celui passé en paramètre, moi je souhaiterais pouvoir choisir. Donc j'arrive à le faire après, comment pourrais-je faire pour l'ajouter avant ?

Merci énormément
Ptite Pupuce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2007, 23h52   #8
Invité régulier
 
Inscription : octobre 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 15
Points : 6
Points : 6
Je totalement c****

J'ai compris après coup que tu avais déjà fais une fonction qui ajoutait après, je croyais que c'était pas possible et que la solution était celle pour ajouter avant.

Bref, j'ai rien pigé... Je suis pas blonde pourtant

Je te remercie julp. Tu as été d'un grand secours
Ptite Pupuce est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h42.


 
 
 
 
Partenaires

Hébergement Web