Extraire des donnees d'un fichier xml pour les utiliser

ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010 - 18 mars 2008 à 19:51
 mima - 26 déc. 2014 à 17:08
Salut a tous

J'ai creer un parseur SAX qui extraire les donnee (element et leurs attributs) et les affiches dans la sortie standard(console)
j'ai
ajoutee ainsi quelques lignes pour recuperer ces donnees dans un
matrice pour les utiliser dans d'autres algorithmes , mais la
compilation a generer des erreurs

voici l'algorithme : pour le test

package parseuravecsax;

//Parse un document XML en java avec L'API SAX
//on importe les APIs necessaire pour l'analyse du XML
import javax.swing.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
//pour l'acces au fichierS
import java.io.*;

public class AnalyseSAX extends DefaultHandler
{
//declaration d'un matrice et les compteurs
    public String[][] ELEMENTS_ATTRIBUTS; //tableau pour recuperer les donnees extraitent du fichier
    int x = 0;
    int y = 0;

    //Methode principale
    public void Parseur_fichier(String nomFichier)
    {

        //si le fichier qui est passe en argument est oublie --->erreur
        if (nomFichier.isEmpty() == true)
        {
            System.out.println("erreur, Le fichier est endommagee ou il n'existe pas");
            System.exit(1);
        }
        //on lance l'analyseur avec le fichier xml en parametre
        DefaultHandler handler = new AnalyseSAX();
        SAXParserFactory factory;
        factory = SAXParserFactory.newInstance();
        try
        {
            SAXParser saxparser = factory.newSAXParser();
            saxparser.parse(new File(nomFichier), handler);
        }
        catch (Throwable t)
        {
            //Si on a une erreur pendant l'analyse
            t.printStackTrace();
            System.exit(1);
        }
//        System.exit(0);
    }
//fin de L'analyse
    //les methodes qui suivnet sont appelees automatiquement par l'analyseur
    //lorsqu'un evenement  est detectee dans le fichier xml
    @Override
    public void startDocument() throws SAXException
    {
        System.out.println("debut du document");
    }

    @Override
    public void endDocument() throws SAXException
    {
        System.out.println("fin du document");
    }

    @Override
    public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException
    {
        String eName = sName;
        if ("".equals(eName))
        {
            eName = qName;
        }
        System.out.println("balise ouverte:" + eName);

// recuperation de L'element trouvee dans le tableau --->ligne x colonne 0
        ELEMENTS_ATTRIBUTS[x][0].concat(eName);
        x += 1;
       
        if (attrs != null)
        {
            //Listage des attributs
            if (attrs.getLength() != 0)
            {
                System.out.println("Listage des parametres pour la balise " + eName + ":");
            }
            for (int i = 0; i < attrs.getLength(); i++)
            {
                String aName = attrs.getLocalName(i);//recuperation du nom de l'attribut
                if ("".equals(aName))
                {
                    aName = attrs.getQName(i);
                }
                System.out.println(" " + aName + "="" + attrs.getValue(i) + """);

//recuperation des valeurs des attributs dans les colonnes de tableau ---> par exemple ligne 1 colonne y             
                ELEMENTS_ATTRIBUTS[x][y].concat(attrs.getValue(i));
                y = i;
            }
        }
    }

    @Override
    public void endElement(String namespaceURI, String simpleName, String qualifiedName) throws SAXException
    {
        String nomElement = simpleName;
        if (nomElement.equals(""))
        {
            nomElement = qualifiedName;
        }
        System.out.println("Balise fermée : " + nomElement);
    }

    @Override
    public void characters(char[] ch, int start, int end) throws SAXException
    {
        String chaine = new String(ch, start, end);
        chaine = chaine.trim();
        if (!chaine.equals(""))
        {
            System.out.println("donnees : " + chaine);
        }
    }

    public void affichage_tab()
    {
        System.out.println("");
        System.out.println("le tableau");
        for (int i = 0; i < ELEMENTS_ATTRIBUTS.length; i++)
        {
            for (int j = 0; j < ELEMENTS_ATTRIBUTS[i].length; j++)
            {
                System.out.println(ELEMENTS_ATTRIBUTS[i][j]);
            }
        }
    }
}
....

pour les lignes en rouge L'erreur est provoquee car je n'ai pas initialiser le tableau
apres
l'initialisation le programme marche mais apres l'execution de la
methode en vert(affichage_tab) le tableau s'affichera avec les valeurs
initials de la declaration faite

un solution.....?

15 réponses

uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
19 mars 2008 à 03:18
C'est plus simple d'utiliser une ArrayList:

...
import java.util.ArrayList;
import java.util.List;

public class AnalyseSAX extends DefaultHandler {
//declaration d'un matrice et les compteurs
    //tableau pour recuperer les donnees extraitent du fichier
    public List<List<String>> elementsAttributes = new ArrayList<List<String>>();
...
    public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) throws SAXException {
        String eName = sName;
        if ("".equals(eName)) {
            eName = qName;
        }
        System.out.println("balise ouverte:" + eName);

// recuperation de L'element trouvee dans le tableau --->ligne x colonne 0
        List<String> ligne = new ArrayList<String>();
        ligne.add(eName);

        if (attrs != null) {
            //Listage des attributs
            if (attrs.getLength() != 0) {
                System.out.println("Listage des parametres pour la balise " + eName + ":");
            }
            for (int i = 0; i < attrs.getLength(); i++) {
                String aName = attrs.getLocalName(i);//recuperation du nom de l'attribut
                if ("".equals(aName)) {
                    aName = attrs.getQName(i);
                }
                System.out.println(" " + aName + "="" + attrs.getValue(i) + """);

//recuperation des valeurs des attributs dans les colonnes de tableau ---> par exemple ligne 1 colonne y            
                ligne.add(attrs.getValue(i));
            }
        }
        elementsAttributes.add(ligne);
    }
...
    public void affichage_tab() {
        System.out.println("");
        System.out.println("le tableau");
        for (List<String> line : elementsAttributes) {
            for (String column : line) {
                System.out.print(column+" ");
            }
            System.out.println("");
        }
    }
}
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
21 mars 2008 à 00:25
j'ai essayee votre proposition , mais toujours pas de resultat a l'affichage..... ,,, le ArrayListe tout comme le matrice est vide , ca me gene beaucoup car le reste du programme que je fait s'arretera a cause de cette diffuculté (tout ce que je veut est de recuperer les element et leur attributs et les utiliser comme des variables pour les autres classes)

le temp passe si vite et moi je ne reste coinsee a cause de cette difficulte qui apparaitre rien devant les experts....
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
21 mars 2008 à 02:56
Bon, voila un exemple complet: ParseurAvecSax.jar
Tu trouvera le code source dans le jar.
Amuse-toi bien!
0
oui , mais comment télechargé ! ( .jar)
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
21 mars 2008 à 23:54
Merci beaucoup, je veux le tester 
0

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

Posez votre question
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
23 mars 2008 à 21:23
Salut uhrand

say ca marche  , merci pour votre aide
on reste on contact si je trouve d'autres problemes

merci encore
bonne journee.
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
24 mars 2008 à 23:53
est ce que je peut transformer ce array list en un tableau de String
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
25 mars 2008 à 10:05
oui
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
25 mars 2008 à 22:10
Comment ?
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
26 mars 2008 à 05:52
crée un tableau et copie la liste dedans
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
30 mars 2008 à 14:00
qu'est vous disez de ca

public void Recuperation_donnee(String nomfich)
    {
        String [][] tab =new String [elementsAttributes.size()][40];
        int i = 0,j=0;
//        A.affichage_tab();
        for( List<String> line: A.elementsAttributes )
        {
            for (String Column: line)
            {
                tab[i][j]=Column;
                j+=1;
            }
            i+=1;
        }
        for (int k = 0; k < tab.length; k++)
        {
            System.out.println("lingne : "+k);
            for (int l = 0; l < tab[k].length; l++)
            {
                System.out.println(tab[k][l]);
            }
        }
    }
0
uhrand Messages postés 491 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 15 juillet 2012 9
30 mars 2008 à 15:47
        String[][] tab = listToArray(elementsAttributes);
        dispTab(tab);
...
    private String[][] listToArray(List<List<String>> list) {
        String[][] tab = new String[list.size()][];
        for (int row = 0; row < tab.length; row++) {
            List<String> rowList = list.get(row);
            String[] rowArray = new String[rowList.size()];
            tab[row] = rowArray;
            for (int column = 0; column < rowArray.length; column++) {
                rowArray[column] = rowList.get(column);
            }
        }
        return tab;
    }
    private void dispTab(String[][] tab) {
        for (int row = 0; row < tab.length; row++) {
            String[] strings = tab[row];
            for (int column = 0; column < strings.length; column++) {
                String string = strings[column];
                System.out.print(string + " ");
            }
            System.out.println("");
        }
    }
0
KaouechZoubeir Messages postés 1 Date d'inscription vendredi 11 avril 2008 Statut Membre Dernière intervention 5 janvier 2009
5 janv. 2009 à 10:22
Salut a tous
Je veux créer un passeur qui extraire les données (nom des classes , leurs attributs,les jointures et les types du jointure(many to many,one to many ....) d'un fichier xmi et les sauvegarder dans une ArrayList .
Le probleme c'est que je ne connait pas la structure  du fichier xmi. Je suis bloqué.
Y a t'il une solution???
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
6 janv. 2009 à 17:01
Tout d'abord tu doit trouver des support concernant XMI pour que tu pourra maitriser ce langage.
Puis selon votre besoin tu doit trouver un parseur (API pour java) qui parse ces types des fichiers
Pour XML il y a DOM et SAX, mais pour XMI je pense qu'il existe aussi .
Essai de voir ça
http://software.topcoder.com/catalog/document?id=21662592
et ça
http://software.topcoder.com/catalog/c_component.jsp?comp=13272138&ver=1
0
foued1986a Messages postés 2 Date d'inscription vendredi 20 février 2009 Statut Membre Dernière intervention 7 mai 2010
30 mars 2010 à 19:11
Salut a tous
mon probleme c'est que je suis en train de realiser un lemmatiseur de la
langue arabe , quelqu'un ma dit d'utiliser un fichier xml pour extraire des données en lui considéré comme une base des données

SVP aidez moi comment je peut le faire
0
ramzi ramzi Messages postés 24 Date d'inscription vendredi 22 septembre 2006 Statut Membre Dernière intervention 31 mars 2010
31 mars 2010 à 11:35
Oui tu peut faire ca,
commence d'abords de lire des ouvrages sur XML pour déterminer son importance concernant ton projet, et s'il est la meilleur solution pour ton problème.
0
Rejoignez-nous