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 31/12/2007, 01h14   #1
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
Par défaut [DOM] Supprimer plusieurs fils dans un noeuds

Salut,

Voici la structure de mon fichier XML :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<laboratoires>
  <struct>
    <id>1</id>
    <nom>...</nom>
    <description/>
    <logiciels>
      <logiciel/>
      <logiciel/>
    </logiciels>
    <pageWeb generation="auto"/>
  </struct>
  <struct>
    <id>2</id>
    <nom>...</nom>
    <description/>
    <logiciels>
      <logiciel/>
      <logiciel/>
    </logiciels>
    <pageWeb generation="auto"/>
  </struct>
</laboratoires>
en fait je veux supprimer les fils de <logiciels>, autrement dit les <logiciel> , j'ai essayé avec ce code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$res = $xpath->query('/laboratoires/struct[id = "' . $id . '"]');
		$n = $res->item(0);
 
 
		$res = $xpath->query('logiciels',$n);
		$r=$res->item(0);
		foreach ($r->childNodes as $child) {
			$child->parentNode->removeChild($child);
		}
 
 
 
		$dom->save('laboratoires.xml');
le $n contient la bonne valeur, tout semble correcte, je n'obtient aucun message d'erreur mais le probleme c'est que les lignes de code :

$res = $xpath->query('logiciels',$n);
$r=$res->item(0);
foreach ($r->childNodes as $child) {
$child->parentNode->removeChild($child);
}


ne suppriment rien du tout!!!!!!

aidez moi svp à corriger les erreurs


merci



...
Mo_Poly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2008, 02h26   #2
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
aucune reponse


bon ya du nouveau dans mon code qui ne marche pas encore à 100%

je vous montre mon code


Code :
1
2
3
4
5
6
$res = $n->getElementsByTagName('logiciel');
 
		foreach ($res as $child)
		{
			$child->parentNode->removeChild($child);
		}
ce code la ne supprime que deux fils et je ne sais pas pourquoi, supposons que j'ai 4 fils, j'affiche res->length j'obtient 4, et pourtant dans le foreach ca ne boucle que deux fois!!!!!! j'ai affiché res->length dans la boucle j'obtient 4 3 !!!!!! ca ne continue pas a boucler ... vous avez une idée sur ce probléme bizarre ?



merci



...
Mo_Poly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2008, 12h23   #3
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
Pourquoi ne pas le(s) cibler directement par votre expression XPath ?
Code :
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
<?php
$xml = <<< EOX
<laboratoires>
  <struct>
    <id>1</id>
    <nom>...</nom>
    <description/>
    <logiciels>
      <logiciel/>
      <logiciel/>
    </logiciels>
    <pageWeb generation="auto"/>
  </struct>
  <struct>
    <id>2</id>
    <nom>...</nom>
    <description/>
    <logiciels>
      <logiciel/>
      <logiciel/>
    </logiciels>
    <pageWeb generation="auto"/>
  </struct>
</laboratoires>
EOX;
 
$id = 2;
 
header('Content-type: text/plain');
$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->formatOutput = TRUE;
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$res = $xpath->query('/laboratoires/struct[id = "' . $id . '"]/logiciels/*');
foreach ($res as $n) {
    $n->parentNode->removeChild($n);
}
 
echo $dom->saveXML();
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2008, 18h13   #4
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
merci ca marche



...
Mo_Poly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 19h41   #5
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
J'ai le meme probléme sur un autre fichier XML

voici la structure de mon fichier XML:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mysql>
  <database name="personnes">
    <table>
      <fiche>
        <var name="id">1001</var>
        <var name="nom">...</var>
        <var name="prenom">...</var>
        <var name="statut">....</var>
        <var name="formation">...</var>
        <var name="pageWebPerso" generation="auto"/>
        <var name="photo"/>
        <var name="distinctions" generation="none"/>
        <var name="implicationprojet">
          <projet>1</projet>
          <projet>2</projet>
        </var>
        <var name="tel">...</var>
        <var name="local">...</var>
        <var name="courriel">...</var>
        <var name="implicationlabo">
          <laboratoire>...</laboratoire>
        </var>
      </fiche>
je veux supprimer toutes les balises <projet> mais ça ne marche pas, j'ai essayé avec ce code :

Code :
1
2
3
4
5
foreach ($noeuds['implicationprojet']->childNodes as $child) {
 
			$child->parentNode->removeChild($child);
 
		}
mais ça ne supprime pas toutes les balises

J'ai essayé de cibler directement avec mon expression XPath:

Code :
1
2
3
4
5
6
7
8
9
$res = $xpath->query('/mysql/database/table/fiche[id = "' . $id . '"]/var[@name = "implicationprojet"]/*');
 
	foreach ($res as $child)
 
	{
 
		$child->parentNode->removeChild($child);
 
	}
j'obtient ce message d'erreur à cause de la ligne $res .. :

Fatal error: Call to a member function query() on a non-object in /home/magnu/Admin/personnes/saveeditpers.php on line 66

Apparament mon expression XPath contient une erreur, que je n'arrive pas à localiser!

Merci de m'aider


...
Mo_Poly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 19h47   #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
Non, l'erreur indique plutôt que le problème se situe bien en amont : $xpath représente visiblement tout sauf un objet DOMXPath.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 20h01   #7
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
Citation:
Envoyé par julp Voir le message
Non, l'erreur indique plutôt que le problème se situe bien en amont : $xpath représente visiblement tout sauf un objet DOMXPath.

effectivement, j'ai changé mon code :

Code :
1
2
3
4
5
6
7
8
9
10
$xpath2 = new DOMXPath($fiche->ownerDocument);
	$res = $xpath2->query('var[@name = "implicationprojet"]/*');
 
	foreach ($res as $child)
 
	{
 
		$child->parentNode->removeChild($child);
 
	}
Le probléme c'est que ça ne supprime rien du tout



...
Mo_Poly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 20h08   #8
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
Je ne puis tester Il faudrait savoir ce que retourne l'expression (var_dump($res)) car je pense que votre expression est incomplète au niveau du chemin donc celle-ci ne vous retournerait, en toute logique, rien.

Soit vous donnez un chemin absolu (tel que celui que vous avez donné plus haut) ou bien pour en utiliser un relatif à la fiche, il faut préciser le noeud de référence (deuxième paramètre - facutatif - de la méthode query) qui serait ici votre $fiche.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2008, 21h11   #9
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
J'ai ressayé avec le path absolue, meme resultat ca ne supprime rien


voici le resultat de l'exression var_dump($res) : object(DOMNodeList)#4 (0) { }

à vrai dire, je n'ai rien compris de ce que ça veut dire


ça c'est mon code avecle chemin absolu:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$xpath2 = new DOMXPath($dom);
 
	$res = $xpath2->query('/mysql/database/table/fiche[id = "' . $id . '"]/var[@name = "implicationprojet"]/*');
	var_dump($res);
 
	foreach ($res as $child)
 
	{
 
		$child->parentNode->removeChild($child);
 
	}

merci



...
Mo_Poly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 00h11   #10
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
En effet, c'est vrai que le var_dump est peu parlant, il vaut mieux s'en référer à la méthode length du DomNodeList résultant.

Bref, je n'ai pas tilté plus tôt mais votre expression est incohérente par rapport à la structure du document au niveau de :
Code X :
fiche[id = "' . $id . '"]
Puisque chaque élément fiche ne dispose pas d'un fils id.

Ce serait plutôt une expression dans ce genre :
Code :
$res = $xpath2->query('/mysql/database/table/fiche[var[@name = "id" and text() = "' . $id . '"]]/var[@name = "implicationprojet"]/*');
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 17h53   #11
Membre régulier
 
Étudiant
Inscription : février 2007
Messages : 378
Détails du profil
Informations personnelles :
Âge : 27
Localisation : Canada

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2007
Messages : 378
Points : 90
Points : 90
effectivement


merci



...
Mo_Poly 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 03h01.


 
 
 
 
Partenaires

Hébergement Web