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

Format d'échange (XML, JSON...) Java Discussion :

Suppression d'un élément Parent [JDOM]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut Suppression d'un élément Parent
    Bonjour

    Voilà, j'ai un document XML dont la structure ressemble à ceci :
    <racine>
    <element>
    <titre>titre 1</titre>
    <contenu>contenu 1</contenu>
    </element>
    <element>
    <titre>titre 2</titre>
    <contenu>contenu 2</contenu>
    </element>
    <element>
    <titre>titre 3</titre>
    <contenu>contenu 3</contenu>
    </element>
    </racine>
    Je sais comment supprimer un élément fils (par exemple : <contenu>contenu 2</contenu>) mais comment supprimer totalement l'élément dont le titre est titre 2 ?
    Je veux donc supprimer :

    <element>
    <titre>titre 2</titre>
    <contenu>contenu 2</contenu>
    </element>
    Ca peut paraitre stupide mais je bloque là-dessus...

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Le plus simple m'a l'air la méthode detach(), qui enlève l'élément en question du document.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Element element = (Element) XPath.selectSingleNode(document, "//element[contenu/text() = 'contenu 2']");
    element.detach();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Le plus simple m'a l'air la méthode detach(), qui enlève l'élément en question du document.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Element element = (Element) XPath.selectSingleNode(document, "//element[contenu/text() = 'contenu 2']");
    element.detach();
    Dans mon cas, ce serait plutôt ça non ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Element element = (Element) XPath.selectSingleNode(document, "//element[titre/text() = 'contenu 2']");
    element.detach();
    Cela donnerait ça :

    <racine>
    <element>
    <titre>titre 1</titre>
    <contenu>contenu 1</contenu>
    </element>
    <element>
    <contenu>contenu 2</contenu>
    </element>
    <element>
    <titre>titre 3</titre>
    <contenu>contenu 3</contenu>
    </element>
    </racine>
    ou ça ?

    <racine>
    <element>
    <titre>titre 1</titre>
    <contenu>contenu 1</contenu>
    </element>
    <element>
    <titre>titre 3</titre>
    <contenu>contenu 3</contenu>
    </element>
    </racine>
    Parce que c'est la deuxième situation qui m'intéresse.

    Merci à toi pour ta réponse déjà.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    Bon, j'ai trouvé la solution au problème

    La voici, elle sera surement utile à d'autres :

    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
    public void supprElement(String element)
    	{
    		try
    		{
    			//On récupère le fichier XML sous forme de flux
    			InputStream stream = new FileInputStream(new File(cheminPredef));
    			SAXBuilder sxb = new SAXBuilder();
     
    			//On crée le document xml avec son flux
    			try
    			{
    				xmlDocument = sxb.build(stream);
    			}
    			catch (JDOMException e){}
    			catch (IOException e){}
     
    			racine = xmlDocument.getRootElement();
     
    			List listElements = racine.getContent();
    			for (int i = 0; i < listElements.size(); i++)
    			{
    				Object objetElement = listElements.get(i);
    				if (objetElement instanceof Element)
    				{
    					Element childObjetElement = (Element)objetElement;
    					Element elementTitre = childObjetElementElement.getChild("titre");
    					if (elementTitre.getText().equals(element))
    					{
    						listElements.remove(i--);
    					}
    				}
    			}
    			enregistreXML("elements.xml");
    			JOptionPane.showMessageDialog(this, "L'élément a bien été supprimé.", "Information", JOptionPane.INFORMATION_MESSAGE);
    		}
    		catch (IOException e){}
    	}

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Khyinn Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Element element = (Element) XPath.selectSingleNode(document, "//element[titre/text() = 'contenu 2']");
    element.detach();
    Tout à fait. Désolé pour l'erreur, mais je vois que tu n'as eu aucun mal à corriger. Enfin, je suppose que le texte est 'titre 2', mais voilà, quoi.

    Bon, j'ai trouvé la solution au problème
    Euh, c'est vrai que ça marche, mais tu as remarqué que ma solution marchait aussi, en 2 lignes qui se comprennent tout de suite ?

    Si le titre à chercher est un paramètre variable, il est possible de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<Element> nodes = (List<Element>)XPath.selectNodes(document, "//element");
     
    for(Element node : nodes) {
      String titre = node.getChild("titre").getText();
      if(titre.equals(element)) {
        node.detach();
      }
    }
    C'est assez court et ça marche pour ton exemple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 51
    Par défaut
    En effet, je pense que ça peut fonctionner aussi mais XPath me génère une erreur lorsque j'utilise ton code donc après avoir cherché son origine sans succès, je me suis penché sur la façon de le faire uniquement avec JDOM.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ah, c'est vrai qu'il y a une dépendance à Jaxen. En général les outils comme Maven incluent cette dépendance d'eux-mêmes et je n'ai pas à m'en occuper, du coup j'oublie.

    (Et puis, ici, XPath ne sert qu'à remplacer document.getRootElement().getChildren("element") . Ce que j'essaie de dire c'est que JDOM permet de programmer simplement, ce n'est pas plus mal d'en profiter.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Récupérer les dimensions de l'élément parent ?
    Par ghohm dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 02/09/2006, 10h22
  2. [CSS] Elements flottants et taille de l'élément parent
    Par Blustuff dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/07/2006, 16h31
  3. Réponses: 8
    Dernier message: 01/04/2006, 10h10
  4. [XML] exclure des éléments d'un éléments parent
    Par Djakisback dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 31/03/2006, 10h45
  5. Réponses: 14
    Dernier message: 01/12/2003, 17h47

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