Bonjour,
Je voudrais mettre à jour mon fichier xml à partir d'une BD.
Est ce qu'il y a quelqu'un qui a une idée là dessus.
Merci d'avance
Bonjour,
Je voudrais mettre à jour mon fichier xml à partir d'une BD.
Est ce qu'il y a quelqu'un qui a une idée là dessus.
Merci d'avance
je me suis peut être pas bien exprimé.
Bon supposant que j'ai un fichier xml de ce genre:
Alors supposons que j'ai une base de donnée qui contient 2 colonnes (chapitre, auteur).
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 <?xml version="1.0" encoding="ISO-8859-1"?> <root> <chapitre titre="Titre du chapitre 1"> <partie titre="Titre de la partie 1"> Texte de la partie 1 du chapitre 1 </partie> <partie titre="Titre de la partie 2"> Texte de la partie 2 du chapitre 1 </partie> </chapitre> <chapitre titre="Titre du chapitre 2"> <partie titre="Titre de la partie 1"> Texte de la partie 1 du chapitre 2 </partie> <partie titre="Titre de la partie 2"> Texte de la partie 2 du chapitre 2 </partie> </chapitre> </root>
Alors le but c'est d'ajouter un attribut dans la balise chapitre du document xml un attribut qui contient le nom de l'auteur qui correspond au bon chapitre.
Est ce qu'il y a quelqu'un qui a une idée là dessus. Merci d'avance
L'objectif c'est d'ajouter un attribut, dans la balise <chapitre>, qui correspond au nom de l'auteur.
cad si pour une balise <chapitre> j'ai titre="Titre du chapitre 1" et que pour ce chapitre j'ai un auteur qui s'appelle titi ben le résultat est donc:NB: J'aimerai bien traiter ce problème avec du java
Code : Sélectionner tout - Visualiser dans une fenêtre à part <chapitre titre="Titre du chapitre 1"; Auteur="titi">
Merci. J'espère que j'étais clair cette fois
Tu utilises quelle API pour attaquer ton fichier XML? Du DOM ou du SAX?
Voici un exemple qui fonctionne avec ton document que tu as fourni:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 package xmltest; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class Test { private static File content; static{ try { content = new File(Test.class.getResource("content.xml").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } } public static void main(String[] args) { try { DocumentBuilder doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document d = doc.parse(content); NodeList list = d.getElementsByTagName("chapitre"); for(int i = 0; i < list.getLength(); i++){ Node node = list.item(i); if(node.getNodeName().equalsIgnoreCase("chapitre")){ Element chapitre = (Element)node; if(node.hasAttributes()){ NamedNodeMap attributes = node.getAttributes(); Node titre = attributes.getNamedItem("titre"); String auteur = getAuteur(titre.getNodeValue()); chapitre.setAttribute("auteur", auteur); } } } Source source = new DOMSource(d); Result result = new StreamResult(new File("result.xml")); Transformer xformer = TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerFactoryConfigurationError e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } } private static String getAuteur(String nodeValue) { // accès à ton DAO pour récupérer l'auteur du chapitre suivant le titre return "AUTEUR"; } }
Pourquoi se compliquer la vie ?
Tu as une BD dont t aimerai convertir le contenu en xml !
1) connecte-toi a la BD
2) execute ta requete
j'espère que ça t'aidera a resoudre ton probleme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ResulteSet rs = s.executeQuery("select titre,auteur from ..."); while(rs.next()){ tonfichier.write("<chapitre>); tonfichier.write("<titre>"+rs.getDtring("titre")+"</titre>); tonfichier.write("<auteur>"+rs.getString("auteur")+"</auteur>"); // //ça depend aussi de la structure de ta base de données si les parties sont dans une autre table tu peux executer une autre requete et recuperer les infos dans un ResultSet et refaire le meme traval pour l'ecriture de ton fichier xml // tonfichier.write("</chapitre>); }![]()
c'est pas forcément plus simple.... et au niveau conception.... bof mélanger l'accès à la base et l'écriture du fichier xml.... pas top je trouve
ce que med_ellouze demandait c'est de mettre à jour un document déjà existant il me semble
Tout d'abord, je tiens à vous remercier pour vos réponse,
Comme il a dit, Pollux, j'ai déjà un document xml et je veux le mettre à jour.
J'ai bien aimé ton code Pollux, mais je suis un peu bloqué au niveau de la méthode getAuteur.
Bon, j'ai commencé par créer une nouvelle classe "ConnexionSGBD" dans le meme package que la classe que tu m'a donné "Test".
Ensuite pour faire un petit test, j'ai ajouté deux méthode dans la même classe ConnexionSGBD
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173 import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; /** * @author <strong> Mohamed ELLOUZE</strong> * @obj Stage */ public class ConnexionSGBD { // les chaines utiles a la connexion avec valeurs par defaut private String driver = "com.mysql.jdbc.Driver"; private String url = "jdbc:mysql://localhost:3306/livre"; private String login = "root"; private String password = ""; private Connection conn = null; /* Afficher quelques informations à propos the database connection */ public void printInfo(Connection c) throws Exception { // Get meta-data about the database DatabaseMetaData info = c.getMetaData(); System.out.println("\nConnected to :\t" + info.getURL()); System.out.println("Driver :\t" + info.getDriverName()); System.out.println("Version :\t" + info.getDriverVersion()); } /* Afficher tous les SQLWarning */ private boolean checkForSQLWarnings(SQLWarning w) throws SQLException { boolean warning = false; if(w != null) { warning = true; System.out.println("\n**** Warning ****\n"); while(w != null) { System.out.println("SQLState: " + w.getSQLState()); System.out.println("Message: " + w.getMessage()); System.out.println("Erreur: " + w.getErrorCode()); System.out.println(""); w = w.getNextWarning(); } } return warning; } public void setDriver(String newDriver) { driver = newDriver; } public void setLogin(String newLogin, String newPassword) { login = newLogin; password = newPassword; } public void setUrl(String newUrl) { url = newUrl; } public Connection getConnection() { return conn; } /* Afficher tous les SQLException */ private void printSQLErrors(SQLException e) { while(e != null) { System.err.println("SQLState: " + e.getSQLState()); System.err.println("Message: " + e.getMessage()); System.err.println("Erreur: " + e.getErrorCode()); System.err.println(""); e = e.getNextException(); } } public void loadDriverAndConnect() throws Exception { try { // Si la connexion existe deja : on ferme d'abord, puis on re-ouvre if (conn!=null && !conn.isClosed() ) { conn.close(); } // Load the jdbc driver for MySQL /** * Le nom de la machine ou s'execute le SGBD MySQL : localhost (en local) * Le numero de port sur lequel le SGBD est à l'écoute : 3306 * le nom de la base de données à accéder : test * le login : root * le mot de passe : [aucun] * */ Class.forName(driver); // Etablir une connexion to the database source using Thin JDBC driver conn = DriverManager.getConnection(url, login, password); // Afficher un warning messages si nécessaire checkForSQLWarnings(conn.getWarnings()); // Print info messages printInfo(conn); } catch(SQLException e) { System.err.println("\n*** SQLException caught in LoadDriver()"); printSQLErrors(e); throw e; } catch(Exception e) { // Ce type d'erreur est affiché si JDBC driver used ne peut pas se charger System.err.println("\n*** Exception caught in LoadDriver()"); throw e; } } /** * Fermer la connexion to the data base source */ public void close() throws Exception { try { conn.close(); System.out.println("Test : Disconnecting ..."); } catch(Exception e) { System.err.println("\n*** Exception caught in close()"); throw e; } } public void createTablesAndInit() throws Exception { Statement stmt = conn.createStatement(); String creerTableBiblio = "CREATE TABLE bibliotheque" + "(id mediumint(10) NOT NULL default '0', titre varchar(100) NOT NULL default '',"+ "auteur varchar(100) NOT NULL default '',livre varchar(100) NOT NULL default '', " + "PRIMARY KEY (`id`)"+ ")ENGINE=MyISAM DEFAULT CHARSET=latin1"; stmt.executeUpdate(creerTableBiblio); stmt.executeUpdate("INSERT INTO bibliotheque VALUES (1, 'Titre du chapitre 1', 'momo', 'java')"); stmt.executeUpdate("INSERT INTO bibliotheque VALUES (2, 'Titre du chapitre 2', 'mamadou', 'xml')"); } }
Bon comme vous le voyez ici, je fais un test bien particulier, je prends titre='Titre du chapitre 1' mais bon, ce que je veux c'est qu'il sera d'une façon dynamique, c'est à dire tout dépend de ce qu'il y a dans la balise comme titre, ben il va chercher la bonne information dans la BD.
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 void selectData() throws Exception { Statement stmt = conn.createStatement(); ResultSet rs = null; String requete = " SELECT auteur, livre, titre"+ " FROM bibliotheque"+ " where titre='Titre du chapitre 1' "; try{ rs = stmt.executeQuery(requete); } catch(SQLException e){ System.err.println("Erreur dans selectData() - 1"); throw e; } while(rs.next()) { String aut = rs.getString("auteur"); String liv = rs.getString("livre"); String tit = rs.getString("titre"); System.out.println("le titre\t"+tit+"\test contenu dans le livre\t"+liv+ " \t et a comme auteur\t" +aut); } } public static void main(String[] args) { ConnexionSGBD t = new ConnexionSGBD(); try{ t.loadDriverAndConnect(); t.createTablesAndInit(); t.selectData(); t.close(); } catch(Exception e) { System.err.println("\n*** SQLException caught in main()"); } }
Donc c'est là ou on va utiliser la méthode getAuteur. mais vu que je débute en xml, ché pas trop comment gérer ça.
J'ai pensé à faire ça, mais je suis pas sur, je l'ai pas encore testé, mais je pense qu'il y a des trucs à modifier et surtout à optimiser
voilà voilà, j'attends vos commentaires...
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 private static String getAuteur(String nodeValue) { // création d'une fabrique de documents DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // création d'un constructeur de documents DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(content); // on recupere la racine du document Element racine = doc.getDocumentElement(); // on definit la tag a modifier String tag = "chapitre"; NodeList liste = racine.getElementsByTagName(tag); // recupération du premier element chapitre // j'ai pas utilisé de boucle vu que dans le main j'utilise déjà une Element chapitre = (Element)liste.item(0); // recuperation de l'attribut titre NamedNodeMap attributes = chapitre.getAttributes(); Node titre_att = attributes.getNamedItem("titre"); // accès à ton DAO pour récupérer l'auteur du chapitre suivant le titre Statement stmt = conn.createStatement(); ResultSet rs = null; String requete = " SELECT auteur"+ " FROM bibliotheque"+ " where titre="+titre_att+"; try{ rs = stmt.executeQuery(requete); } catch(SQLException e){ System.err.println("Erreur dans selectData() - 1"); throw e; } while(rs.next()) { String AUTEUR = rs.getString("auteur"); } return "AUTEUR"; }
Pour benben02, merci pour ta réponse.
Si j'ai bien compris ton code, je pense que t'es entrain de construire un document à partir d'une bd alors que je veux modifier mon fichier xml (qui existe déjà) et regénrer un nouveau fichier xml tout en se basant sur le fichier initial xml et des données dans ma BD.
Par contre, je viens de poster une proposition pour gérer ce problème, mais je pense qu'il y a quelques petits problèmes.
Si t'as des propositions ou des commentaires, ben n'hésites surtout pas![]()
je viens de tester le code que je viens de poster et il y a un problème au niveau de cette ligne :
il n'arrive pas à connaitre conn, pourtant j'importe la classe ConnexionSGBD dans la fichier Test.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part Statement stmt = conn.createStatement();
J'ai meme essayer de la définir en tant que variabe locale mais il n'arrive pas à le saisirVoilà j'ai essayé de mettre ça, mais ça marche pas
Si quelqu'un a une idée merci de m'eclairicir un peu
Code : Sélectionner tout - Visualiser dans une fenêtre à part public Connection conn;
Le code que je t'ai posté envois déjà la valeur de l'attribut titre à la méthode getAuteur si jamais
Pour ton problème d'accès à la base de donnée. Je te propose de regarder dans la FAQ et si tu trouves pas, d'ouvrir un nouveau post parce que là ca n'a plus grand chose à voir avec XML.
Ok, merci. je poste demain le bon code complet comme ça , ça peut servir à d'autres membres du groupe.
Mais juste un petit truc, est ce que tu peux regarder si la méthode getAuteur que j'ai posté est bien codé (comme je t'ai dit, je débute un peu avec xml et avec java d'ailleur, donc s'il y a des remarques ou des critiques sur la façon dont elle a était codé, n'hésites surtout pas).
Merci.
Dans le code que tu m'as envoyé, je vois que t'as défini un fichier qui s'appelle "content" à de ton fichier source content.xml
Je voulais savoir si c'est possible d'appliquer le code qui est juste en dessous sur plusieurs fichiers xml en même temps et non pas sur le fichier "content" uniquement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 static{ try { content = new File(Test.class.getResource("content.xml").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } }
voilà , par exemple j'ai un répertoire (c:\ProjetXml) qui contient 3 fichier xml (a_1.xml, a_10.xml, a_100.xml) et en fait, je voulais savoir comment pourrai-je exécuter la classe Test sur ces 3 fichiers en une seule fois.
Je pense que la solution est de passer ces trois fichiers en paramètres dans la méthode main, mais vu que je débute en programmation, j'aimerai bien savoir s'il existe déjà des methodes en java qui permettent de faire ça.
Ensuite une fois, c'est fait, j'aimerai bien changé le nom des fichiers en ajoutant par exemple update à la fin du fichier. c'est à dire en final, j'aurai (a_1-update.xml, a_10-update.xml, a_100-update.xml).
Merci d'avance.
Il y a pas de problème. Tu peux "customiser" la classe comme tu veux. Sache juste que la méthode main ne s'invoque pas par ton code. Tu n'as donc qu'à modifier la signature de la méthode en lui ajoutant en paramètre un File que tu passeras à ton Document (pour la source donc) et un autre File pour la destination du traitement.
St,
Je viens d'exécuter ce code et comme par hasard, j'ai une erreur et j'avoue que j'ai bien compris le type d'erreur (apparemment il n'arrive pas à trouver le chemin du content.xml)
J'ai essayé de mettre le bon chemin en modifiant content.xml par c:/testxml/content.xml (en fait c'est là ou il se trouve le fichier content.xml) mais c'est tjs la même erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 static{ try { content = new File(Test.class.getResource("content.xml").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } }
et j'ai une autre fenetre qui s'affiche dont laquelle il m'indique qu'il n'est pas capable de trouver the main class.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Java.lang.ExceptionInitializerError cause by : java.lang.NullPonterException at dom.Test.<clinit>(Test.java:42) qui correspond à cette ligne là content = new File(Test.class.getResource("content.xml").toURI());
Merci pour votre lumière.
Code : Sélectionner tout - Visualiser dans une fenêtre à part could not find the main class. Program will exit
une petite précision peut être :
voilà ma classe finale :
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 package dom; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import dom.ConnexionSGBD; public class Test { private static File content; public static Connection conn = null; static{ try { content = new File(Test.class.getResource("c:/testxml/content.xml").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } } private static String getAuteur(String nodeValue) throws SQLException { // accès au BD pour récupérer l'auteur du chapitre suivant le titre Statement stmt = conn.createStatement(); ResultSet rs = null; String requete = " SELECT auteur"+ " FROM bibliotheque"+ " where titre="+nodeValue; try{ rs = stmt.executeQuery(requete); } catch(SQLException e){ System.err.println("Erreur dans selectData() - 1"); throw e; } while(rs.next()) { String AUTEUR = rs.getString("auteur"); } return "AUTEUR"; } public static void main(String[] args) { ConnexionSGBD t = new ConnexionSGBD(); try { t.loadDriverAndConnect(); //t.createTablesAndInit(); //t.selectData(); DocumentBuilder doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document d = doc.parse(content); NodeList list = d.getElementsByTagName("chapitre"); for(int i = 0; i < list.getLength(); i++){ Node node = list.item(i); if(node.getNodeName().equalsIgnoreCase("chapitre")){ Element chapitre = (Element)node; if(node.hasAttributes()){ NamedNodeMap attributes = node.getAttributes(); Node titre = attributes.getNamedItem("titre"); String auteur = getAuteur(titre.getNodeValue()); chapitre.setAttribute("auteur", auteur); } } } Source source = new DOMSource(d); Result result = new StreamResult(new File("c:/testxml/result.xml")); Transformer xformer = TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result); // fermer le serveur Mysql t.close(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerFactoryConfigurationError e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (DOMException e) { // TODO Bloc catch auto-généré e.printStackTrace(); } catch (SQLException e) { // TODO Bloc catch auto-généré e.printStackTrace(); }catch(Exception e) { System.err.println("\n*** SQLException caught in main()"); } } }
Donc comme vous le voyez dans la méthode main
Je fais une instance de la classe ConnexionSGBD, Je tiens à préciser que c'est une classe à part qui a été codé dans le même package que la classe Test et dont vous trouvez le code sur la page 1 "mettre à jour un xml à partir d'une BD"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public static void main(String[] args) { ConnexionSGBD t = new ConnexionSGBD(); try { ...........
J'espère que j'étais clair
Merci d'avance
Est ce que tu peux détailler un peu s'il te plait
Code : Sélectionner tout - Visualiser dans une fenêtre à part Tu n'as donc qu'à modifier la signature de la méthode en lui ajoutant en paramètre un File que tu passeras à ton Document (pour la source donc) et un autre File pour la destination du traitement.
Partager