Parser java exportant du XML dans mySQL

cs_sandji Messages postés 7 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 22 mai 2005 - 24 mars 2005 à 13:31
zeldoi5 Messages postés 58 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 13 novembre 2005 - 23 mai 2005 à 09:33
Bonjour,



Je travaille sur un projet de gestion administrative d'une association.

J'ai effectué des recheches dans le but de trouver un parser en java exportant du XML dans une base de données MySql.

Malheureusement je n'ai rien trouvé.

Est ce que vous connaissez un parser correspondant à ces critères?



Merci d'avance,

Sandrine

7 réponses

zeldoi5 Messages postés 58 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 13 novembre 2005 2
11 avril 2005 à 09:42
Bonjour, c'est à peu près ce que je fais (enfin ce que j'essaie de faire!) :
j'utilise un parseur SAX en java pour parser le fichier XML
Ensuite c'est assez simple d'accéder à la base de données MySQL avec Java...

Si tu veux que je t'envoie ce que je fais, envoie moi un mail.
0
zeldoi5 Messages postés 58 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 13 novembre 2005 2
13 avril 2005 à 09:41
VOici donc mon code :

J'ai écrit mon code à partir d'un programme éxistant (assez bugé tout de même...).
J'ai une classe principale (classe Main.java), une seconde qui me lit un fichier XML et qui dois insérer les données contenues dans le fichier xml dans MySQL (classe LireXML.java) et une troisième qui me fait la connexion à la base de données (mais celle ci ne fonctionne pas, ej me prends la tête dessus......)
J'utilise un parseur SAX pour l'XML (c'est assez simple à utiliser, mais à comprendre pas simple du tout! enfin pour moi!!)
Voici mon programme :

Classe Main :
import java.util.*;
import java.io.*;
import java.sql.*;
import java.awt.*;
import java.lang.*;

public class Main
{
public static void main(String[] args)
{

/*if(args.length<1)
{
System.out.println("Vous devez donner le chemin du fichier *.xml a injecter dans la base de données!");
}
else*/
{
try
{
//String url=args[0];
String url="test3.xml";
//System.out.println("Fichier a analyser : "+url);
LireXML fichierxml = new LireXML();
fichierxml.LireXML(url);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
//System.out.println("\nFin du programme.\n");
System.exit(0);
}
}
}

Classe LireXML :
import java.io.*;
import java.util.*;
import java.sql.*;
import java.lang.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
{
// Pour gérer l'indentation du document final.
private String indentString = " ";
private int indentLevel = 0;
//public String balise;
public String mbalise="";
public String mvaleur="";
public String result="";


// Démarrage de votre programme
public static void LireXML (String url) {
System.out.println("Entree dans LireXML");
/*if (url.length != 1) {
System.err.println ("Vous devez preciser un ficher a analyser!");
System.exit(-1);
}*/
SAXParserFactory factory = SAXParserFactory.newInstance();
try
{
SAXParser saxParser = factory.newSAXParser();
saxParser.parse( url, new LireXML() );
//saxParser.parse( new File(argv [0]), new Echoing() );
//saxParser.parse(new File(argv [0]), new Echoing() );
}
catch (Throwable t) {t.printStackTrace ();}
System.exit(0);

/////////////////////////////////////////////////////////////
// Connexion à la base de Données /////////////////////////
/////////////////////////////////////////////////////////////
try
{
DataBaseManager db = new DataBaseManager();
}
catch (Exception e) {
//System.err.println(requete);
//onError();
System.err.println("Erreur pendant la connexion à la base de donnees : " + e.getMessage());
}
}



/////////////////////////////////////////////////////////////
// Les gestionnaires d'évènements SAX ///////////////////////
/////////////////////////////////////////////////////////////

public void startDocument () throws SAXException
{
System.out.println("\n __START DOCUMENT__ \n");
}

public void endDocument () throws SAXException
{
System.out.println("\n __END DOCUMENT__ \n");
if (indentLevel > 0) System.out.println("AIEEEE probleme....");
}

public void startElement (String name, AttributeList attrs) throws SAXException
{
ResultSet result;
try
{
//System.out.println("Pré appel à DataBaseManager");
//DataBaseManager db = new DataBaseManager();

DataBaseManager db = new DataBaseManager("192.168.0.52","Serv","toto");

//System.out.println("Post appel à DataBaseManager");
//System.out.println("Etat de l'ouverture de la base de données : "+db);
tabs();
//System.out.print("<"+name);
//balise = name;
if (attrs != null) {
for (int i = 0; i < attrs.getLength (); i++) {
System.out.println();
tabs();
//System.out.print(" ");
//System.out.print(attrs.getName (i));
mbalise=attrs.getName (i); //Prend ici la valeur de la balise et la met dans la variable
// mbalise
//System.out.print(mbalise+" ");
//System.out.print(" = "");
//System.out.print(attrs.getValue (i));
mvaleur=attrs.getValue (i); //Prend ici la valeur après la balise et la met dans la
// variable mvaleur
//System.out.print(mvaleur+" ");
//System.out.print(""");

//Test sur le contenu de mvaleur
}
}
if (attrs.getLength() > 0) { System.out.println(""); tabs(); }
//System.out.println(">");
indentLevel++;
}
catch (Exception e) {
//System.err.println(requete);
//onError();
System.err.println("Erreur pendant le traitement et/ou la connexion a la base de donnees : " + e.getMessage());
}
}

// Fonctions de Fin d'élément
public void endElement (String name) throws SAXException
{
indentLevel--;
tabs();
//System.out.println("</"+name+">");
}



// Fonctions de Contenus de balise
public void characters (char buf [], int offset, int len) throws SAXException
{ String s = new String(buf, offset, len); }


// Fonctions utilitaires
private void tabs()
{
for(int i=0;i<indentLevel;i++)
{ System.out.print(indentString); }
}


// Connexion à la base de Données
//db.close();
}
0
cs_sandji Messages postés 7 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 22 mai 2005
8 mai 2005 à 23:18
Merci beaucoup pour ta réponse, je suis partie dans le même
ordre d'idées que toi, j'utilise sax1 mais j'ai des petits problèmes
pour la connection à la base de do, je dois avoir des erreurs dans mon
code...

Et je dois dire que les tutoriaux n'aident pas beaucoup car c'est très généralistes et compliquées...

Par contre, pour comparer les balises puis envoyer leur contenu dans la
bdd , tu le fais dans la méthode startElement ou characters?



Et toi, ton projet, ça a aboutit? tout marche?
0
zeldoi5 Messages postés 58 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 13 novembre 2005 2
9 mai 2005 à 10:01
De rien.
Pour comparer les balises je le fais dans startElement :


//-------------------------------------------------------------------------
// START ELEMENT
public void startElement (String name, AttributeList attrs) throws SAXException
{
String datecomplete="";
String date1="";
String date2="";
ResultSet result;
try
{
tabs();
if (attrs != null)
{
for (int i = 0; i < attrs.getLength (); i++)
{
System.out.println();
tabs();
mbalise=attrs.getName (i); //Prend ici la valeur de la balise et la met dans la variable
// mbalise
System.out.print(mbalise+" ");
mvaleur=attrs.getValue (i); //Prend ici la valeur après la balise et la met dans la
// variable mvaleur
System.out.print(mvaleur+" ");
if (mbalise=="X")
{
System.out.print("Identifiant vaut : X");
}
if (mbalise=="Y")
{
System.out.print("Identifiant vaut : X");
}
.................
}
}
if (attrs.getLength() > 0) { System.out.println(""); tabs(); }
indentLevel++;
}
catch (Exception e) { System.err.println("Erreur pendant le traitement : " + e.getMessage()); }
}
//----------------------------------------------------------------



Les tutoriels ne m'ont pas trop apporté non plus....
Par contre les codes des autres si!!!



Tu veux ma classe de connexion à MySQL?


Au fait, quelle version de MySQL utilises tu? (car j'ai rencontré des problèmes de connexion avec les dernières versions cf. : v > 4.1.X)
Est ce que tu arrives à te connecter avec phpMyAdmin?
(travailles tu sur le même poste?)


Je pense que tu dois avoir des problèmes de drivers JDBC, moi j'ai galéré avec ce dernier, je vais te dire comment faire.... :


download le drivers jdbc ( mysql-connector-java-3.XXX-bin.jar ) à l'adresse suivante :
http://mysql.crihan.fr/' target='_blank'>http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-3.1.8a.zip/from/http://mysql.crihan.fr/


Tu le télécharges et tu mets le fichiers jar dans C:\j2sdk1.X\jre\lib\ext (en fait c'est le fichier Driver.class qui se trouve dans \org\gjt\mm\mysql qui est très important....)


Après tu te connectes par :
Class.forName("org.gjt.mm.mysql.Driver");
Et tu établis ta connexion par :
connection = DriverManager.getConnection("jdbc:mysql://serveur:port/base",login,password);
ou
connection = DriverManager.getConnection("jdbc:mysql://serveur/base",login,password); si le port utilisé pour le serveur de BDD est par défaut (3306 à ce qu'il me semble....)



Voici ma classe de connexion GestionBDD :



//-----------------------------------------------------------------------------------------
import java.util.*;
import java.io.*;
import java.sql.*;


public class GestionBDD
{
Connection connection=null;
Statement stmt;
public String VilleTrouvee,AdresseTrouvee,DeptTrouve,NomImmeubleTrouve,AdresseTotale;


private Connection connect;
private Statement state;
private String url = null;
private String login = null;
private String pwd = null;
private static int _numThread = 200;


// Méthode de création de base de données
public void CreateBase(String url, String username, String password)
{
String AddT =
"create table if not exists table_essai(..................)";
// Tentative de connexion à la base de données :
try
{
Class.forName("org.gjt.mm.mysql.Driver");
}
catch (Exception e)
{
System.out.println(
"Impossible d'effectuer le Class.forname.\n" +
"Impossible d' enregistrer the Driver JDBC.\n" +
"Assurez vous que le driver JDBC est dans le\n" +
"classpath.\n" );
System.exit(1);
}
try
{ connection = DriverManager.getConnection(url, username, password); }
catch (SQLException e)
{
System.out.println(
"Impossible d'etablir une connexion à la database.\n" +
"Cause(s) imputee(s): " + e.getMessage());
System.exit(1);
}
try
{
try
{
stmt = connection.createStatement() ;
stmt.executeUpdate(AddT);
}
catch (SQLException e)
{
System.out.println(
"Une erreur est apparue\n" +
"Message SQLException: " + e.getMessage());
}
}


// Méthode d'ouverture de la Base de Données :
public void OuvertureBase(String url, String username, String password)
{ System.out.println("\nOuverture Base de Donnees MySQL en cours...");
try
{
Class.forName("org.gjt.mm.mysql.Driver");
}
catch (Exception e)
{
System.out.println(
"Impossible d'effectuer le Class.forname.\n" +
"Impossible d' enregistrer the Driver JDBC.\n" +
"Assurez vous que le driver JDBC est dans le\n" +
"classpath.\n" );
System.exit(1);
}
try
{ connection = DriverManager.getConnection(url, username, password); }
catch (SQLException e)
{
System.out.println(
"Impossible d'etablir une connexion aà la database.\n" +
"Fin de la connexion prematuree.\n" +
"Cause(s) imputee(s): " + e.getMessage());
System.exit(1);
}
try
{
stmt = connection.createStatement() ;
}
catch (SQLException e)
{
System.out.println(
"Une erreur est apparue\n" +
"Message SQLException: " + e.getMessage());
}
System.out.println("Base de Donnees MySQL Ouverte avec Succes!");
}


// Méthode de fermeture de base de données :
public void CloseBase()
{ System.out.println("\nFermeture Base de Donnees MySQL en cours...");
try
{
// .... Il faut utiliser 'connection' pour dialoguer avec la base de données
stmt = connection.createStatement() ;
stmt.close() ;
connection.close();
}
catch (SQLException e)
{
System.out.println(
"Une erreur est apparue\n" +
"Message SQLException: " + e.getMessage());
return;
}
System.out.println("\nBase de Donnees MySQL Fermee avec Succes!\n");
}


//----------------------------------------------------------------------------------


En ce qui me concerne j'ai beaucoup travaillé sur du PHP ces derniers temps et pas trop avancé sur le traitement de l'arborescence XML, mais je vai m'y remettre...Donc one ne peut pas dire que ça marche!


Voili voulou, n'hésite pas si t'as des soucis!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sandji Messages postés 7 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 22 mai 2005
22 mai 2005 à 13:59
je voudrais tout d'abord te remeercier pour ton aide, ça m'a permis de bien avancer.

Mon parser marche nickel, je récupère les éléments mais maintenet j'ai
des problèmes de connection à ma base de données, j'ai télécharger les
fichiers que tu m'avait dit mais je ne vois pas où les mettre ni
comment .



Mon code est le suivant :



private String url ="jdbc:mysql://localhost/gestionmind";

private String user = "nobody";

private String password = null;

try {

Class.forName("com.mysql.jdbc.Driver");

} catch (Exception e)

{

System.out.println(


"Impossible
d'effectuer le Class.forname." +


"Impossible d' enregistrer the Driver
JDBC." +


"Assurez vous que le driver JDBC est
dans le\n" +

"classpath.\n" );

System.exit(1);

}



try{

con = DriverManager.getConnection(url,user,password);

}



catch(SQLException ex) {

System.out.println("erreur pendant la connexion à la base de données " + ex.getMessage());

System.exit(1);

}





Et il m'affiche le message d'erreur suivant :

erreur pendant la connexion à la base de données No driver found for localhost



Pour l'instant les dossiers .jar sont à l'emplacement suivant :
/home/mind/java-connector/mysql-connector-java/ alors que ma classe
pour me connecter à la base de do est à l'emplacement
var/www/java/mysql .



Est ce que tu vois comment je dois faire et ce que je dois faire.



Je sais que ça touche le classpath mais je n'y connais vraiment rien du tout sur ça.



Merci beaucoup ben pour ta patience,

Sandrine
0
zeldoi5 Messages postés 58 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 13 novembre 2005 2
23 mai 2005 à 09:20
Bonjour, c'est assurément un problème de drivers JDBC, tu as plusieurs possibilités :
- soit tu mets manuellement le fichier .jar dans le répertoire utilisé par java, pour moi c'est :
C:\j2sdk1.4.0\jre\lib\ext\
- soit tu fixes manuellement le classpath, dans une fenêtre MS-DOS par la commande suivante :
set classpath=C:\j2sdk1.4.0\jre\lib\ext\mysql.jar;.\

Pour être sûr que ça marche j'ai fait les deux! Mais l'un ou l'autre suffisent! Tiens moi vite au courant!
0
zeldoi5 Messages postés 58 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 13 novembre 2005 2
23 mai 2005 à 09:33
J'ai oublié : mysql.jar étant le driver JDBC mysql-connector-3.17...jar renommé! (j'avais aps envie de tout retapper dans le classpath...)
0
Rejoignez-nous