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

APIs XML Discussion :

Suppression d'un élément dans un fichier XML


Sujet :

APIs XML

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Suppression d'un élément dans un fichier XML
    Salut à tous!

    J'aimerais créer une méthode pour supprimer un élément dans un fichier XML. En fait, je voudrais supprimer un élément particulier, càd, celui dont l'attribut "name" correspond au String elt.

    Le problème est que j'utilise le type "Element" pour faire la recherche du bon élément, et le type "Node" pour réaliser la suppression.

    Je ne connais pas d'autres méthodes...

    Voici ma méthode JAVA:
    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
     
    public void removeElt(String elt){
    	NodeList list= document.getElementsByTagName("uIndex");
    	int nb= list.getLength();
    	int i=0;
    	while &#40;i<nb&#41;&#123;
    		Node child = list.item&#40;i&#41;;
    		Element childElt = &#40;Element&#41;child;
    		String atr = childElt.getAttribute&#40;"name"&#41;;
    		if &#40;atr.equals&#40;elt&#41;&#41;&#123;
    			root.removeChild&#40;child&#41;;
    		&#125;
    		i=i+1;
    	&#125;
    	save&#40;&#41;;
    &#125;
    et mon fichier XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <uIndexList xmlns&#58;xsi="http&#58;//www.w3.org/2001/XMLSchema-instance" xsi&#58;noNamespaceSchemaLocation="./xsd/uIndexList.xsd">
    	<uIndex name="un"/>
    	<uIndex name="coucou"/>
    	<uIndex name="salut"/>
    	<uIndex name="bijour"/>
    	<uIndex name="hello"/>
    	<uIndex name="rigole"/>
    	<uIndex name="ralout"/>
    </uIndexList>
    Merci d'avance!

  2. #2
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 42
    Points
    42
    Par défaut Méthode getAttribute
    Salut,

    Il faut utiliser la méthode 'getAttribute' (méthode de l'objet Node dont hérite l'objet Element) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getAttribute&#40;"name"&#41;
    Tu récupères dans une variable la valeur de l'attribut 'name' et tu fais un test :

    Zoltar.
    Co-rédacteur du site : www.atelierweb.ma (IE only)

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Re: Méthode getAttribute
    Merci Zoltar, mais c'est un peu ce que je fais, je pense...
    Non???

    Je ne peux pas utiliser la méthode getAttribute(String) sur un Node, elle n'est valable que pour le type Element.
    Et je dois travailler sur un Node pour faire ma suppression!
    De plus, je ne peux pas "caster" mon Node en un Element.

    Si j'ai mal compris ta répnose, dis le moi...

    Merci quand même

    Citation Envoyé par zoltar
    Salut,

    Il faut utiliser la méthode 'getAttribute' (méthode de l'objet Node dont hérite l'objet Element) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getAttribute&#40;"name"&#41;
    Tu récupères dans une variable la valeur de l'attribut 'name' et tu fais un test :

    Zoltar.

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 42
    Points
    42
    Par défaut Effectivement
    Effectivement, c'était une coquille, désolé

    C'est la méthode removeChild qui est une méthode de Node dont hérite element. La méthode getAttributes n'est pas une méthode de Node.

    Tu peux essayer la propriété 'attributes' de Node : tu obtiens une collection de type NamedNodeMap des noeuds attributs, enfants du noeud spécifié ou null s'il n'en existe pas.

    Tu devrais avoir un code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    attribs=le_Node.attributes;
    if&#40;attribs&#40;0&#41;.value=="elt"&#41;
    ...
    Zoltar.
    Co-rédacteur du site : www.atelierweb.ma (IE only)

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Re: Effectivement
    Oui, je veux bien essayer, mais ça me permettra encore de supprimer le Node???

    Je crains qu'en faissant ça, je ne sois plus capable de supprimer le Node. Car il faut que le Node que je veux supprimer soit rattaché à un Node père. => pour pouvoir utiliser la méthode Node removeChild(Node oldchild)

    Or, en faisant ce que tu me dis, je vais récupérer une liste de Nodes.
    Est-ce que les Nodes de cette liste entretiennent toujours des relations entre-eux, ou avec leur origine??? Est-ce qu'ils sont associés au père???

    Merci

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 35
    Points : 42
    Points
    42
    Par défaut Reponse
    Salut,

    Oui, je veux bien essayer, mais ça me permettra encore de supprimer le Node???
    En faisant :

    Tu récupères la liste (ou collection des noeuds attributs associés à un noeud de type élément. Au lieu d'utiliser la méthode getAttributes qui va pointer sur un attribut nommé, tu récupères avec cette méthode l'ensemble des attributs. Donc attribs(0) est le premier attribut de la liste.
    Au niveau de la suppression, rien ne change.
    Co-rédacteur du site : www.atelierweb.ma (IE only)

  7. #7
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Salut,

    Je ne comprend pas où est ton problème Itof : ton code fonctionne ou pas? Moi le seul problème que je vois c'est que si les fils de uIndex ne sont pas tous des elements ton code génère une exception lors du transtypage. Par contre si tu es sur que tous les fils de "uIndex" sont des elements, alors il faut qu'on m'explique ou est le problème.

    Cordialement,

  8. #8
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Mon code ne fonctionne pas... il me crache une "CastException". Comme toi, je me demande pourquoi, vu le format de mon fichier XML. Juges en par toi même!
    Si tu vois où pourrais se trouver l'erreur, n'hésite pas à me le faire savoir!

    Merci!

    Citation Envoyé par philemon_siclone
    Salut,

    Je ne comprend pas où est ton problème Itof : ton code fonctionne ou pas? Moi le seul problème que je vois c'est que si les fils de uIndex ne sont pas tous des elements ton code génère une exception lors du transtypage. Par contre si tu es sur que tous les fils de "uIndex" sont des elements, alors il faut qu'on m'explique ou est le problème.

    Cordialement,

  9. #9
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    t'as essayé de debugger ? d'afficher le nodeName() et le nodeType() du noeud avant transtypage, par exemple ?

    Sinon, si tu veux juste securiser ton code sans comprendre je suppose qu'il suffit de faire :
    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
    public void removeElt&#40;String elt&#41;&#123; 
       NodeList list= document.getElementsByTagName&#40;"uIndex"&#41;; 
       int nb= list.getLength&#40;&#41;; 
       int i=0; 
       while &#40;i<nb&#41;&#123; 
          Node child = list.item&#40;i&#41;; 
          if &#40;child.getNodeTYPE&#40;&#41; == ELEMENT_NODE&#41;
          &#123;
          Element childElt = &#40;Element&#41;child; 
          String atr = childElt.getAttribute&#40;"name"&#41;; 
          if &#40;atr.equals&#40;elt&#41;&#41;&#123; 
             root.removeChild&#40;child&#41;; 
    &#125;
          &#125; 
          i=i+1; 
       &#125; 
       save&#40;&#41;; 
    &#125;
    Cordialement,

    PS : code pas compilé, pas testé (désolé, c'est juste que j'ai pas le jdk, je code en C++).

  10. #10
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    j'suis con...

    C'est bien sur le fait de boucler de 0 à n-1 alors que tu supprimes des elements dans la boucle qui fait tout foirer, non?

  11. #11
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    j'suis con...

    C'est bien sur le fait de boucler de 0 à n-1 alors que tu supprimes des elements dans la boucle qui fait tout foirer, non?

  12. #12
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Je propose le code suivant (pas compilé, pas executé):
    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
     
    public void removeElt&#40;String elt&#41;&#123; 
       NodeList list= document.getElementsByTagName&#40;"uIndex"&#41;; 
       int i=list.getLength&#40;&#41;; 
       while &#40;i>0&#41;&#123; 
          i--;
          Node child = list.item&#40;i&#41;; 
          Element childElt = &#40;Element&#41;child; 
          String atr = childElt.getAttribute&#40;"name"&#41;; 
          if &#40;atr.equals&#40;elt&#41;&#41;&#123; 
             root.removeChild&#40;child&#41;; 
          &#125; 
       &#125; 
       save&#40;&#41;; 
    &#125;

  13. #13
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Oh Putain!!!!!!!!!

    je n'ai pas d'autres mots!!!! MERCI!!!!

    Ca fonctionne, c'est parfait! Si tu pouvais juste m'expliquer ce qui diffère avec mon code... ça pourrait m'aider pour la suite de mon job

    Merci beaucoup, c'est cool que des mecs comme toi passent un peu de leur temps pour aider des mecs paumés comme moi!!!

    A+ Itof


    Citation Envoyé par philemon_siclone
    Je propose le code suivant (pas compilé, pas executé):
    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
     
    public void removeElt&#40;String elt&#41;&#123; 
       NodeList list= document.getElementsByTagName&#40;"uIndex"&#41;; 
       int i=list.getLength&#40;&#41;; 
       while &#40;i>0&#41;&#123; 
          i--;
          Node child = list.item&#40;i&#41;; 
          Element childElt = &#40;Element&#41;child; 
          String atr = childElt.getAttribute&#40;"name"&#41;; 
          if &#40;atr.equals&#40;elt&#41;&#41;&#123; 
             root.removeChild&#40;child&#41;; 
          &#125; 
       &#125; 
       save&#40;&#41;; 
    &#125;

  14. #14
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Bon déjà as-tu compris le problème ?
    Si tu as 4 fils (indexés de 0 à 3), mettons que l'avant dernier soit celui qu'il faille supprimer. Lors de la suppression i vaut donc 2. Tu supprimes le noeud, tu incrementes i (qui vaut maintenant 3) et tu essais d'acceder à item(3) alors qu'il n'y plus que 3 fils dans ta liste de noeud. Donc il doit renvoyer Null; et transtyper Null en "Element", ça marche pas .

    Maintenant mes modifs doivent te paraitre limpides...

    Tcho,

  15. #15
    Candidat au Club
    Inscrit en
    Novembre 2003
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bien vu!!!

    C'est tout de suite plus clair

    Merci beaucoup, et au plaisir de te revoir (qui sais?! )

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

Discussions similaires

  1. [JDOM] Suppression d'un élément dans un fichier XML avec JDOM
    Par pomolo11 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 08/12/2013, 12h36
  2. [DOM] Insertion d'élément dans un fichier XML en PHP
    Par marcus13 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 03/04/2008, 14h51
  3. [XPATH] Récupérer un élément dans un fichier XML
    Par be_tnt dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 07/06/2007, 20h49
  4. Comment ajouter un élément dans un fichier XML
    Par sorilazer dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 04/06/2007, 22h56
  5. [VB.NET] [XML] Suppression d'un noeud dans un fichier XML
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/09/2004, 12h24

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