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 :

Modifier fichier xml avec des namespaces [JDOM]


Sujet :

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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Modifier fichier xml avec des namespaces
    bonjour,

    j'ai un petit souci avec la modification de fichier xml.

    J'ai pas de souci pour modifier des fichiers xml sans namespace. Par contre si il y a un namespace je bloque..

    voila le 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
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>
    <job-scheduling-data
    	xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
    	version="1.8">
    	<schedule>
    		<job>
    			<name>FirstJob</name>
    			<group>GroupJob</group>
    			<description>This is FirstJob</description>
    			<job-class>com.mkyong.jobs.FirstJob</job-class>
    		</job>
    		<trigger>
    			<cron>
    				<name>dummyTrigger</name>
    				<group>GroupTrigger</group>
    				<job-name>FirstJob</job-name>
    				<job-group>GroupJob</job-group>
    				<!-- toute les heures -->
    				<cron-expression>0/2 * * * * ?</cron-expression>
    			</cron>
    		</trigger>
    	</schedule>
    </job-scheduling-data>
    j'aimerais modifier la valeur de <cron-expression>0/2 * * * * ?</cron-expression> en <cron-expression>* 0/2 * * * ?</cron-expression>pour charger mon fichier j'utilise SAX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SAXBuilder sxb = new SAXBuilder();
    document = sxb.build(new File(fichier));
    racine = document.getRootElement();
    je ne sais pas comment faire avec les namespaces !

    merci d'avance !

    Cédric

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Qu'est-ce que tu n'arrive pas à faire? A priori ça ce traite de la même manière dans ton cas, puisque tu ne crée pas de noeud, tu ne fais que modifier un noeud #TEXT

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    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
    public class JDom
    {
       static Document document;
       static Element racine;
     
       public static void main(String[] args)
       {
           try
           {
              lireFichier("Exercice2.xml");
              recupElement("cron-expression");
            }
            catch(Exception e){
            	System.out.println(e);
            }
       }
     
       static void lireFichier(String fichier) throws Exception
       {
          SAXBuilder sxb = new SAXBuilder();
          document = sxb.build(new File(fichier));
          racine = document.getRootElement();
       }
     
       static void recupElement(String element)
       {
          List listTest = racine.getChildren("schedule");
          System.out.println(listTest);
          Iterator i = listTest.iterator();
          while(i.hasNext())
          {
             Element courant = (Element)i.next();
             List listTest2 = courant.getChildren();
             System.out.println(listTest2);
          }
       }
    voila mon code de test juste pour l'affichage.

    sans les namespaces l'affichage donne :

    [[Element: <schedule/>]]
    [[Element: <job/>], [Element: <trigger/>]]


    avec les namespaces :

    []

    dois-je préciser les namespaces ? si oui comment dois-je faire ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    On peux voir tes import? Parce que la class Element dans SAX n'a pas de méthode getChildren. Au mieux tu devrais avoir une erreur de compilation

    Si c'est du JDOM (et non pas du SAX), il y a une méthode public java.util.List getChildren(java.lang.String name, Namespace ns) a utiliser

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    ah oui ! je fais du Jdom, j'ai oublié de le préciser !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
     
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.input.SAXBuilder;
    ah oui !

    en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Namespace ns = Namespace.getNamespace("http://www.quartz-scheduler.org/xml/JobSchedulingData");
    List listTest = racine.getChildren("schedule",ns);
    affichage :

    [[Element: <schedule [Namespace: http://www.quartz-scheduler.org/xml/JobSchedulingData]/>]]
    [Element: <job [Namespace: http://www.quartz-scheduler.org/xml/JobSchedulingData]/>]
    [Element: <trigger [Namespace: http://www.quartz-scheduler.org/xml/JobSchedulingData]/>]

    donc il les trouves bien !

    maintenant il faut que je fasse le changement de valeur ! je ferais sa demain dans la journée et je reviendrais vers vous lorsque j'aurais du nouveau !

    Par contre vous pensez qu'il est préférable de faire de la serialisation xml ? ou de les modifiers directement en parcourant le fichier xml ?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Beau travail pour avoir trouvé comment utiliser les namespaces.

    Concernant la sérialisation : je pense que pour cet usage, la sérialisation XML demanderait bien plus d'efforts que nécessaire pour l'intégrer. Alors qu'il suffit de charger en JDOM, changer un truc et réécrire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    cela conforte mon idée, je comptais utiliser le Jdom !

    je reviens vers vous avec mon avancement !

    encore merci =)

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Si tu avais des changements plus élaborés que ça à faire, par contre, une approche JAXB basée sur le XSD se justifierait sans doute plus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    pour le moment je n'ai que cron-expression a changer,

    mais par la suite je dois pouvoir inserer de nouveau <schedule> ou supprimer des schedule déjà créé

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Iterator;
    import java.util.List;
     
    import org.jdom2.Document;
    import org.jdom2.Element;
    import org.jdom2.Namespace;
    import org.jdom2.input.SAXBuilder;
    import org.jdom2.output.Format;
    import org.jdom2.output.XMLOutputter;
     
    public class JDom
    {
       static Document document;
       static Element racine;
     
       public static void main(String[] args)
       {
           try
           {
              lireFichier("Exercice2.xml");
              modifElement("schedule");
              enregistreFichier("Exercice2.xml");
            }
            catch(Exception e){
            	System.out.println(e);
            }
       }
     
       static void lireFichier(String fichier) throws Exception
       {
          SAXBuilder sxb = new SAXBuilder();
          document = sxb.build(new File(fichier));
          racine = document.getRootElement();
       }
     
       static void modifElement(String element)
       {
    	  Namespace ns = Namespace.getNamespace("http://www.quartz-scheduler.org/xml/JobSchedulingData");
          List listJobScheduling = racine.getChildren("schedule", ns);
          Element Schedule = (Element) listJobScheduling.get(0);
          List listTrigger = Schedule.getChildren("trigger", ns);
          Element trigger = (Element) listTrigger.get(0);
          List listCron = trigger.getChildren("cron", ns);
          Element cron = (Element) listCron.get(0);
          List listCronExpression = cron.getChildren("cron-expression", ns);
          Element cronExpression = (Element) listCronExpression.get(0);
          cronExpression.setText("0 0/2 * * * ?");
       }
     
       static void enregistreFichier(String fichier) throws Exception
       {
             XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
             sortie.output(document, new FileOutputStream(fichier));
       }
    }
    voila en faisaint cela, je passe la valeur de 0/2 * * * * ? a 0 0/2 * * * ?

    Par contre il y a pas un moyen plus rapide de la faire ?

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pourquoi, ce code est lent chez toi?

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Namespace ns = Namespace.getNamespace("http://www.quartz-scheduler.org/xml/JobSchedulingData");
    document.getDescendants(Filters.element("cron-expression", ns)).next()
      .setText("chose bidule machin truc");
    ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Pourquoi, ce code est lent chez toi?
    non non il n'est pas lent mais c'est juste que je dois faire tout le chemin pour aller jusqu'à cron-expression. C'était juste pour savoir si il y avait un moyen plus rapide au niveau du code d'y accéder.

    Citation Envoyé par thelvin
    Namespace ns = Namespace.getNamespace("http://www.quartz-scheduler.org/xml/JobSchedulingData");
    document.getDescendants(Filters.element("cron-expression", ns)).next()
    .setText("chose bidule machin truc");
    Voila ! c'est exactement ça !! merci beaucoup !! ça simplifie vachement le code !

    je me lance maintenant à j'ajout de nouveau schedule !!

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par cdg13 Voir le message
    je me lance maintenant à j'ajout de nouveau schedule !!
    Ça pour le coup, JDOM ne sera pas tellement plus simple que d'essayer d'intégrer un data-binding.

    (Enfin, moi j'ai la phobie des data-bindings, je m'en sers que si on me donne pas le choix... Mais ceux qui n'ont pas d'a priori contre estimeraient que c'est une utilisation normale.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par cdg13 Voir le message
    C'était juste pour savoir si il y avait un moyen plus rapide au niveau du code d'y accéder.
    Tu veux dire plus concis? Ce n'est pas la même chose. Je peux te montrer des codes concis à base de XPath qui seront pas franchement les plus rapides

  16. #16
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Je commence à me documenter sur JAXB!!

    pardonnez moi si je ne m'exprime pas encore bien, je suis encore un novice dans la programmation JAVA

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Bon j'ai généré mes class avec la commande > xjc monxml.xsd

    Je peux à présent parcourir mon xml et obtenir toute les valeurs que je veux ainsi que modifier les valeurs que je veux.

    En revanche je ne vois pas comment faire pour enregistrer mon xml une fois modifier !

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    j'ai finalement reussi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Marshaller marshaller = jc.createMarshaller();
    			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, new Boolean(true));
    			marshaller.marshal(jobSchedul, new File("Exercice2.xml"));
    ça marche super bien et c'est super facile à utiliser !

    encore merci pour tout =)

    bonne journée à vous !!

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

Discussions similaires

  1. lire un fichier XML avec des noeuds, enfants, etc
    Par thor76160 dans le forum C#
    Réponses: 23
    Dernier message: 04/09/2009, 15h14
  2. fichiers XML avec des balises auto-fermantes
    Par processeur dans le forum Général Python
    Réponses: 0
    Dernier message: 15/08/2009, 19h14
  3. [CXF et JAXB] Parser un fichier XML avec des namespaces
    Par cowa dans le forum Services Web
    Réponses: 0
    Dernier message: 26/02/2009, 14h30
  4. Fabriquer un fichier XML avec des imbrications
    Par zooffy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 25/09/2007, 10h20

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