IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] Supprimer plusieurs fils dans un noeuds


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut [DOM] Supprimer plusieurs fils dans un noeuds
    Salut,

    Voici la structure de mon 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
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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



    ...

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut
    aucune reponse


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

    je vous montre mon code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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



    ...

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Pourquoi ne pas le(s) cibler directement par votre expression XPath ?
    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
    <?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();

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut
    merci ca marche



    ...

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut
    J'ai le meme probléme sur un autre fichier XML

    voici la structure de mon 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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


    ...

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Non, l'erreur indique plutôt que le problème se situe bien en amont : $xpath représente visiblement tout sauf un objet DOMXPath.

  7. #7
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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



    ...

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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.

  9. #9
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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



    ...

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $res = $xpath2->query('/mysql/database/table/fiche[var[@name = "id" and text() = "' . $id . '"]]/var[@name = "implicationprojet"]/*');

  11. #11
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 379
    Points : 123
    Points
    123
    Par défaut
    effectivement


    merci



    ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment supprimer plusieurs lignes dans un flexgrid?
    Par js8bleu dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 04/01/2011, 12h20
  2. [XPath] Récupérer plusieurs fils d'un noeud
    Par saidgrd dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 25/02/2010, 12h30
  3. Réponses: 1
    Dernier message: 20/03/2009, 09h47
  4. Ajouter / supprimer plusieurs éléments dans un formulaire
    Par nesswaw dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/03/2008, 10h52
  5. [XML DOM]Supprimer plusieurs noeud
    Par Shandler dans le forum APIs
    Réponses: 9
    Dernier message: 06/06/2007, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo