Bonjour pour tous,

Mon but est de créer un code Java qui permet de changer les valeurs des attributs d’un fichier XML.

Au debut mon fichier XML est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" ?> 
< application >
<interface nom="magic"  abscisse="10"  ordonnee="20"largeur="700" longueur="600" >
  <barre nom="jtoolbar1" abscisse="20"  ordonnee="0" date="0" exit="0" graver="1" help="0" memory="1" open_bd="1" open_cd="1" open_file="1" open_image="1" oriontation="0" server="0" /> 
  </interface>
  </ application >
Pour changer les valeurs des attributs longueur , largeur , abscisse , ordonnée , j’ai utilisé cette fonction :
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
public static void xmlOutputWrite(String cdeName)throws Exception
   {     
 
       try 
{DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                        //Récupère une instanxce de la classe DocumentBuilder
                        DocumentBuilder parser = factory.newDocumentBuilder();
                        //Effectue le parsing avec récupération du noeud DOM Document
                        Document document = parser.parse(cdeName);
                        StreamResult result1=new StreamResult(cdeName );
                        DOMSource source =new DOMSource(document);
 
                        //Element utilisateur = document.getDocumentElement();
                        String xpath = "/application/interface";
                        Element utilisateur = document.getElementById(xpath);
                        Node result = XPathAPI.selectSingleNode(document, xpath);
                        utilisateur = (Element)result;
                         utilisateur.setAttribute("abcisse", "50" ));
                       utilisateur.setAttribute("ordonne","30"));
                      utilisateur.setAttribute("longueur","900", ));
 
                      utilisateur.setAttribute("largeur","800",));
 
 
 
                        try {
             TransformerFactory transformerFactory = TransformerFactory.newInstance();
             Transformer transformer = transformerFactory.newTransformer();
             transformer.setOutputProperty(OutputKeys.METHOD, "xml");
             transformer.setOutputProperty(OutputKeys.INDENT, "yes");
             transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
             transformer.transform(source,result1);
           }
 
           catch (TransformerConfigurationException e) {
             System.out.println(e.getMessage());
           }
 
 
 
       }
          catch (FactoryConfigurationError e) {
                    System.out.println(
                            "impossible de localiser une classe de construction");
                }
   }
Alors maintenant mon fichier XML est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8" ?> 
< application >
<interface nom="magic"  abscisse="10"  ordonnee="20"largeur="700" longueur="600" >
  <barre nom="jtoolbar1" abscisse="20"  ordonnee="0" date="0" exit="0" graver="1" help="0" memory="1" open_bd="1" open_cd="1" open_file="1" open_image="1" oriontation="0" server="0" /> 
 </interface>
<interface nom="magic_view" abscisse="100"  ordonnee="100" largeur="600" longueur="600" >
  <barre nom="tools_bar" abscisse="0" ordonnee="0"  b_diapo="1" b_exit="1" b_fullscr="1" b_home="1" b_imginfo="1" b_imprimer="1" /> 
 </interface>
<interface nom="magic_diaporama" abscisse="100" ordonnee="100" largeur="600" longueur="600" >
  <barre nom="barre_diapo"  abscisse="0" ordonnee="0"  faster="1" nom="p" pause="1" play="1" reserve="1" slower="1" stop="1" /> 
</interface>
  </application>
Dans ce cas, j’ai un problème : Comment je peux changer les attributs d’une interface spécifique ?

Alors j’ai commencé par le parcours du document jusqu’à que je trouve l’interface désirée. Mais je n’ai pas pu changer les valeurs de ses attributs. L’exécution du code a provoqué des erreurs que je n’ai pas pu les corrigées.

Voici la fonction utilisée :
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
  public static void xmlOutputWrite(String cdeName,Magic_Med m)throws Exception
  {Attr rac ;
    try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       //Récupère une instanxce de la classe DocumentBuilder
         DocumentBuilder parser = factory.newDocumentBuilder();
           //Effectue le parsing avec récupération du noeud DOM Document
             Document document = parser.parse(cdeName);
              StreamResult result1=new StreamResult(cdeName );
               DOMSource source =new DOMSource(document);
               Element utilisateur = document.getDocumentElement();
                NodeList application = utilisateur.getChildNodes();
                //le parcours du document
               for (int i = 0; i < application.getLength(); i++)
               {  if (application.item(i).getNodeType() == 1)
                   {
                   if ( application.item(i).getNodeName().equals("interface"))
              {
                 NamedNodeMap interf = application.item(i).getAttributes();
                    rac=(Attr)interf.item(0);
                    if(rac.getValue().equals("magic"))
                { //maintenant je suis dans l'interface desirée 
                  //changement des valeurs de ses attributs 
                  String xpath = "/application/interface";
                           utilisateur = document.getElementById(xpath);
                          Node result = XPathAPI.selectSingleNode(document, xpath);
                          utilisateur = (Element)result;
                        utilisateur.setAttribute("largeur",String.valueOf(m.getWidth() ));
                          utilisateur.setAttribute("longueur",String.valueOf(m.getHeight() ));
                           utilisateur.setAttribute("abcisse",String.valueOf(m.getX() ));
                           utilisateur.setAttribute("ordonne",String.valueOf(m.getY() ));
 
 
                 }}}}
                        try {
             TransformerFactory transformerFactory = TransformerFactory.newInstance();
             Transformer transformer = transformerFactory.newTransformer();
             transformer.setOutputProperty(OutputKeys.METHOD, "xml");
             transformer.setOutputProperty(OutputKeys.INDENT, "yes");
             transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
             transformer.transform(source,result1);
           }
 
           catch (TransformerConfigurationException e) {
             System.out.println(e.getMessage());
           }
 
 
 
       }
          catch (FactoryConfigurationError e) {
                    System.out.println(
                            "impossible de localiser une classe de construction");
                }
   }
Voici les erreurs :
java.lang.NullPointerException
at XMLReadWrite.xmlOutputWrite(XMLReadWrite.java:590)
at fermer.windowClosing(Magic_Med.java:384)
at java.awt.Window.processWindowEvent(Window.java:1121)
at javax.swing.JFrame.processWindowEvent(JFrame.java:266)
at java.awt.Window.processEvent(Window.java:1079)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
S’il vous plait aider moi à résoudre ce problème. Et merci.