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

Android Discussion :

Traiter un très gros fichier XML


Sujet :

Android

  1. #1
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Traiter un très gros fichier XML
    bonjour à tous,

    pour mon application j'ai besoin de récupérer des infos dans un fichier XML assez gros (60+ Mo, environs 1 500 000 lignes)
    ce fichier contient le programme TV de toutes les chaines française pour 2 semaines

    les infos dont j'ai besoin, c'est quel est le programme actuellement diffusé sur nationnal geo par exemple...
    pour récupérer les données je pense pouvoir me débrouiller avec google mais j'aimerais vos conseils.

    Pensez vous qu'il vaut mieux traiter UNE bonne fois le fichier et enregistrer les infos dont j'ai besoin vers une base de données SQL ? j'aurais quelques chose de plus allégé je suppose.




    <programme start="20160602110500 +0200" stop="20160602113500 +0200" showview="78605753" channel="184">
    <title lang="fr">Blunt Talk</title>
    <sub-title lang="fr">I Experience Shame and Anticipate Punishment</sub-title>
    <desc lang="fr">Saison : 1 - Episode : 2/10 - L'équipe de Walter cherche un plan de secours pour sauver le journaliste qui a raté l'occasion de couvrir une importante tempête. Harry, son fidèle homme de main, lui vient en aide en acceptant de faire un sacrifice...
    -- Critique : Walter Blunt, journaliste et animateur télé anglais, vétéran de la guerre des Malouines, est une des plus grandes gueules du petit écran américain. Son émission culte, aux interviews irrévérencieuses, pique pourtant du nez dans les audiences. Après une énième virée nocturne noyée dans le whisky et les cachets en tout genre, il se retrouve au bord du licenciement. Avec l'aide de son équipe &amp;mdash; des solitaires névrosés comme lui &amp;mdash; et de son majordome, véritable nounou rencontrée sur le champ de bataille, Walter va devoir rentrer dans le droit chemin et réinventer son show. Ou pas... On a vu satire du monde des médias plus acide que celle de Blunt Talk, et son créateur, Jonathan Ames, n'est pas aussi à l'aise dans les coulisses de la télé à Los Angeles que dans le New York littéraire de sa première série, Bored to death. Le récit est décousu, on frôle parfois le n'importe quoi, on ne rit pas à tous les coups, mais Ames reste fidèle à son style, spirituel, absurde et chic. Patrick Stewart, acteur shakespearien rendu célèbre par Star Trek, livre un show renversant. De tous les plans, il hurle, râle, s'agite, danse, remue ses 75 printemps comme un jeune homme. &amp;mdash; Pierre Langlais</desc>
    <credits>
    <director>Tristram Shapeero</director>
    <actor>Patrick Stewart (Walter Blunt)</actor>
    <actor>Adrian Scarborough (Harry Chandler)</actor>
    <actor>Timm Sharp (Jim)</actor>
    <actor>Dolly Wells (Celia)</actor>
    <actor>Jacki Weaver (Rosalie Winter)</actor>
    <actor>Mary Holland (Shelly)</actor>
    <actor>Karan Soni (Martin)</actor>
    <actor>Brett Gelman (Ronnie)</actor>
    </credits>
    <date>2015</date>
    <category lang="fr">Série</category>
    <category lang="fr">Série humoristique</category>
    <length units="minutes">30</length>
    <icon src="http://guidetv-iphone.telerama.fr/verytv/procedures/images/2016-06-02_184_11:05.jpg" />
    <episode-num system="xmltv_ns">0.1/10.</episode-num>
    <video>
    <aspect>16:9</aspect>
    <quality>HDTV</quality>
    </video>
    <audio>
    <stereo>bilingual</stereo>
    </audio>
    <previously-shown />
    <rating system="CSA">
    <value>-10</value>
    <icon src="http://www.csa.fr/picts/visuels/picto_cat2.gif" />
    </rating>
    <star-rating>
    <value>1/5</value>
    </star-rating>
    <review lang="fr" type="text">Walter Blunt, journaliste et animateur télé anglais, vétéran de la guerre des Malouines, est une des plus grandes gueules du petit écran américain. Son émission culte, aux interviews irrévérencieuses, pique pourtant du nez dans les audiences. Après une énième virée nocturne noyée dans le whisky et les cachets en tout genre, il se retrouve au bord du licenciement. Avec l'aide de son équipe &amp;mdash; des solitaires névrosés comme lui &amp;mdash; et de son majordome, véritable nounou rencontrée sur le champ de bataille, Walter va devoir rentrer dans le droit chemin et réinventer son show. Ou pas... On a vu satire du monde des médias plus acide que celle de Blunt Talk, et son créateur, Jonathan Ames, n'est pas aussi à l'aise dans les coulisses de la télé à Los Angeles que dans le New York littéraire de sa première série, Bored to death. Le récit est décousu, on frôle parfois le n'importe quoi, on ne rit pas à tous les coups, mais Ames reste fidèle à son style, spirituel, absurde et chic. Patrick Stewart, acteur shakespearien rendu célèbre par Star Trek, livre un show renversant. De tous les plans, il hurle, râle, s'agite, danse, remue ses 75 printemps comme un jeune homme. &amp;mdash; Pierre Langlais</review>
    </programme>
    voici un exemple du fichier xml, beaucoup d'info ne m'intéresse pas.

    Que me conseillez vous ? une base SQL, de récupérer directement l'info dont j'ai besoin dans le XML ou autre méthode... ? je suis débutant en java, c'est pourquoi je demande conseil avant de me lancer vers la mauvaise direction.
    j'ai déjà développé dans le passé des sites en php avec base de données SQL, j'imagine que ça reste la même chose ? ou du moins assez proche ?

    Merci à vous

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Selon moi, le fichier xml doit être stocké coté serveur et un script doit permettre d'en extraire le sous-ensemble xml demandé sous forme d'une URL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://monserveur/extractTV.php?channel=184&period=now
    Le périphérique Android n'aura alors qu'à appeler ce service, et parser le résultat pour l'afficher.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    il n'y a pas un moyen de rester en local ? c'est pas un vraiment un service de programme tv que je souhaite développer mais un lecteur IPTV qui récupère les infos du programme dans un XML

  4. #4
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Si. mais dans ce cas ton appli oblige à télécharger 60mo de Data toutes les semaines. Pas sympa pour le forfait, et pas top pour les perfs (temps de téléchargement)
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    c'est pas bien grave surtout pour la data, pour un lecteur iptv capable de lire une chaine en hd c'est pas les 60mo qui feront mal

    je souhaites rester en local pour que les utilisateurs étrangers puissent configurer le chemin vers l'epg (le fichier xml) des chaines de leurs pays.

  6. #6
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    j'ai besoin de votre aide pour que mon code s'exécute en arrière plan plutôt que sur le thread principal.
    j'ai réussi à faire un bout de code (dans un nouveau projet pour faire mes tests) qui fonctionne, au démarrage ça vient lire la base SQL pour m'afficher quelques info sur mon activité. j'ai juste un bouton qui permet de retraiter le fichier xml et d'enregistrer les infos utiles dans la base SQL. ça fonctionne très bien sauf que j'utilisais un fichier XML minuscule. sur un fichier XML de 20mo j'ai mon application figé et également : "Skipped 3116 frames! The application may be doing too much work on its main thread."

    j'ai pu comprendre qu'il était possible de lancer de lourdes tâches en arrière plan pour palier à mon problème, mais j'ai des difficultés pour l'appliquer à mon code (qui pour vous peut sembler très bordélique et mal optimisé mais soyez indulgent je suis débutant).

    voici mon code

    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
    public class MainActivity extends AppCompatActivity {
        String TableEPG = "epg";
        long TSactuel = System.currentTimeMillis() / 1000L;
        Hashtable ht = new Hashtable();
     
        public String getListe(int x) {
            return String.valueOf(ht.get(x));
        }
        public void setListe(int x, String val) {
            ht.put(x, val);
        }
     
        public static String toTimestamp( String date ) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat( "yyyyMMddHHmm" );
            java.util.Date TSdate = sdf.parse(date);
            String NewDate = String.valueOf(TSdate.getTime() / 1000L);
            return NewDate;
     
        }
     
        TextView texte;
        Button traiterXML;
        @Override
        protected void onCreate(Bundle savedInstanceState)  {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            texte = (TextView) findViewById(R.id.jsonDisplay);
            traiterXML = (Button) findViewById(R.id.startParsing);
     
            ReadAllSQL();
        }
     
     
        public void traiterXML(View v) {
            CreateSQL();
            main();
        }
     
     
     
            public void main() {
     
                SAXBuilder builder = new SAXBuilder();
                File xmlFile = new File("storage/sdcard0/test.xml");
                try {
     
                    Document document = (Document) builder.build(xmlFile);
                    Element rootNode = document.getRootElement();
                    System.out.println("element Root : " + rootNode);
                    List listID = rootNode.getChildren("channel");
                    List listProgramme = rootNode.getChildren("programme");
     
                    Iterator i = listID.iterator();
                    while (i.hasNext()) {
                        Element courant = (Element) i.next();
                        String Chaine = courant.getChild("display-name").getText();
                        String id = courant.getAttributeValue("id");
                        setListe(Integer.parseInt(id), Chaine);
     
                    }
     
                    Iterator j = listProgramme.iterator();
                    while (j.hasNext()) {
                        Element courant = (Element) j.next();
                        String chaine = courant.getAttributeValue("channel");
                        chaine = getListe(Integer.parseInt(chaine));
                        String debut_ts = toTimestamp(courant.getAttributeValue("start"));
                        int debut = Integer.parseInt(debut_ts);
                        String fin_ts = toTimestamp(courant.getAttributeValue("stop"));
                        int fin = Integer.parseInt(fin_ts);
                        int duree = Integer.parseInt(courant.getChildText("length"));
                        String description = courant.getChildText("desc");
                        String programme = courant.getChildText("title");
                        String soustitre = courant.getChildText("sub-title");
                        String image = courant.getAttributeValue("src");
     
                        WriteSQL(chaine, debut, fin, duree, programme, soustitre, description, image);
     
                    }
     
     
                } catch (IOException io) {
                    System.out.println(io.getMessage());
                } catch (JDOMException jdomex) {
                    System.out.println(jdomex.getMessage());
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
     
     
        public void CreateSQL () {
            SQLiteDatabase myDB= null;
            try {
                myDB = this.openOrCreateDatabase("DatabaseName", MODE_PRIVATE, null);
                myDB.execSQL("DROP TABLE IF EXISTS " + TableEPG);
                myDB.execSQL("CREATE TABLE IF NOT EXISTS " + TableEPG + " (chaine VARCHAR, debut INTEGER, fin INTEGER, duree INTEGER, programme VARCHAR, soustitre VARCHAR, description TEXT, image VARCHAR);");
            }
            catch(Exception e) {
                Log.e("Error", "Error", e);
            } finally {
                if (myDB != null)
                    myDB.close();
            }
        }
        public void WriteSQL (String chaine, int debut, int fin, int duree, String programme, String soustitre, String description, String image) {
            SQLiteDatabase myDB = null;
            try {
     
                myDB = this.openOrCreateDatabase("DatabaseName", MODE_PRIVATE, null);
                if (chaine != null) { chaine = chaine.replaceAll("'", "''"); }
                if (programme != null) { programme = programme.replaceAll("'", "''"); }
                if (soustitre != null) { soustitre = soustitre.replaceAll("'", "''"); }
                if (description != null) { description = description.replaceAll("'", "''"); }
                myDB.execSQL("INSERT INTO " + TableEPG + " (chaine, debut, fin, duree, programme, soustitre, description, image)" + " VALUES ('" + chaine + "', " + debut + ", " + fin + ", " + duree + ", '" + programme + "', '" + soustitre + "', '" + description + "', '" + image + "');");
            } catch (Exception e) {
                Log.e("Error", "Error", e);
            } finally {
                if (myDB != null)
                    myDB.close();
            }
        }
     
        public void ReadAllSQL () {
            SQLiteDatabase myDB = null;
            try {
                myDB = this.openOrCreateDatabase("DatabaseName", MODE_PRIVATE, null);
                Cursor c = myDB.rawQuery("SELECT * FROM " + TableEPG , null);
                int Column1 = c.getColumnIndex("chaine");
                int Column2 = c.getColumnIndex("debut");
                int Column3 = c.getColumnIndex("fin");
                int Column4 = c.getColumnIndex("duree");
                int Column5 = c.getColumnIndex("programme");
                int Column6 = c.getColumnIndex("soustitre");
                int Column7 = c.getColumnIndex("description");
                int Column8 = c.getColumnIndex("image");
                String Data="";
                c.moveToFirst();
                if (c != null) {
                    do {
                        String xml_chaine = c.getString(Column1);
                        int xml_debut = c.getInt(Column2);
                        int xml_fin = c.getInt(Column3);
                        int xml_duree = c.getInt(Column4);
                        String xml_programme = c.getString(Column5);
                        String xml_soustitre = c.getString(Column6);
                        String xml_description = c.getString(Column7);
                        String xml_image = c.getString(Column8);
                        Data =Data +xml_chaine+" - "+xml_programme+"/"+xml_debut+" - "+xml_fin+"\n";
                    }while(c.moveToNext());
                }
                texte.setText(Data);
            }
            catch(Exception e) {
                Log.e("Error", "Error", e);
            } finally {
                if (myDB != null)
                    myDB.close();
            }
        }
    }
    merci pour votre aide

  7. #7
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Il faut que tu déplaces ton code dans une AsyncTask par exemple, en le mettant la méthode prévue à cet effet et qui porte bien son nom : doInBackground()
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  8. #8
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    merci, je vais voir ça

  9. #9
    Candidat au Club
    Homme Profil pro
    technicien
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    youhouu j'ai réussi ! c'était pas si compliqué finalement

    ça fonctionne très bien sur un petit fichier de seulement 6Mo mais lorsque je traite un fichier de 28 Mo l'application se ferme au bout d'une 20aine de secondes. (en sachant que certains fichiers peuvent faire + de 60mo)
    y a t-il une limite ? ou une solution pour réduire la charge, quitte à ce que ça prenne plus de temps à traiter ce n'est pas un problème pour l'utilisation.

    en tout cas merci, mon projet avance petit à petit

Discussions similaires

  1. le meilleur langage pour traiter des gros fichiers xml
    Par hansaplast dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 06/07/2009, 22h35
  2. [CSV] Traitement d'un très gros fichier XML ou CSV
    Par Paulux1 dans le forum Langage
    Réponses: 3
    Dernier message: 25/03/2008, 16h05
  3. [SimpleXML] Analyser un très gros fichier XML
    Par Paulux1 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/02/2008, 02h53
  4. Ouvrir un très gros fichier XML
    Par strat0 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 02/11/2007, 13h29
  5. Transformer un très gros fichier XML avec XSL
    Par wozzz dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/05/2006, 10h57

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