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

Format d'échange (XML, JSON...) Java Discussion :

Découper un gros fichier XML en plusieurs fichier de même structure


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut Découper un gros fichier XML en plusieurs fichier de même structure
    Bonjour,

    Je cherche à découper un fichier XML de taille assez importante (jusqu'a 200 Mo) en petit fichier, en sachant que ce fichier contient entre autre une liste, c'est cette liste qui sera découpée pour apparaitre dans les différents fichiers qui résulteront du découpage. Pour ca, je définis une taille de lot, qui définira le nombre max d'élément de la liste que je veux voir apparaitre dans chacun de mes fichiers obtenus après découpage.

    Par exemple, si nous avons en entrée le XML suivant:
    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
    <balise1>
    	<balise2></balise2>
    	<balise3>
    		<sous_balise1></sous_balise1>
    	</balise3>
    	<balise4>
    		<sous_balise2></sous_balise2>
    		<sous_balise3></sous_balise3>
    	</balise4>
    	<list>
    		<data>1</data>
    		<data>2</data>
    		<data>3</data>
    		<data>4</data>
    		<data>5</data>
    		<data>6</data>
    		<data>7</data>
    	</list>
    </balise1>
    et que je définis ma taille de lot a 2, je veux obtenir en sortie les 4 fichiers suivants:

    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
     
    <balise1>
    	<balise2></balise2>
    	<balise3>
    		<sous_balise1></sous_balise1>
    	</balise3>
    	<balise4>
    		<sous_balise2></sous_balise2>
    		<sous_balise3></sous_balise3>
    	</balise4>
    	<list>
    		<data>1</data>
    		<data>2</data>
    	</list>
    </balise1>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <balise1>
    	<balise2></balise2>
    	<balise3>
    		<sous_balise1></sous_balise1>
    	</balise3>
    	<balise4>
    		<sous_balise2></sous_balise2>
    		<sous_balise3></sous_balise3>
    	</balise4>
    	<list>
    		<data>3</data>
    		<data>4</data>
    	</list>
    </balise1>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <balise1>
    	<balise2></balise2>
    	<balise3>
    		<sous_balise1></sous_balise1>
    	</balise3>
    	<balise4>
    		<sous_balise2></sous_balise2>
    		<sous_balise3></sous_balise3>
    	</balise4>
    	<list>
    		<data>5</data>
    		<data>6</data>
    	</list>
    </balise1>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <balise1>
    	<balise2></balise2>
    	<balise3>
    		<sous_balise1></sous_balise1>
    	</balise3>
    	<balise4>
    		<sous_balise2></sous_balise2>
    		<sous_balise3></sous_balise3>
    	</balise4>
    	<list>
    		<data>7</data>
    	</list>
    </balise1>
    Pour cela, je pensais utiliser Stax afin d'optimiser l'utilisation de la mémoire pour faire ce découpage, cependant la tâche semble ardue.

    Je pensais pour cela parcourir le fichier entrant avec un XMLEventReader et pour chaque data que je rencontre j'incrémente un compteur et quand celui ci atteint ma taille de lot je ferme mon XMLEventWriter pour en créer un nouveau avec un nouveau nom de fichier (qui contient par exemple un compteur incrémenté de 1 pour chaque nouveau fichier qui résulte du découpage).

    Le problème, c'est que je ne vois pas comment récupérer dans ces conditions ce qui se trouve au début et à la fin de fichier pour encapsuler la liste de data dedans.

    Est ce que vous avez une idée ou une astuce, est ce que Stax est la meilleure façon de procéder dans mon cas?

    Car sinon j'avais une autre solution en passant par un FileReader, mais j'aurais besoin de plusieurs passages aussi pour pouvoir récupérer tous mes éléments.

    Toute aide ou conseil est la bienvenue.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Lex92 Voir le message
    Le problème, c'est que je ne vois pas comment récupérer dans ces conditions ce qui se trouve au début et à la fin de fichier pour encapsuler la liste de data dedans.
    Pour les informations de début, il suffisait de juste les garder en mémoire, dans une List, au lieu de les passer directement au XMLEventWriter.
    Mais s'il y a aussi des infos à la fin, c'est plus compliqué. Je pense que le plus simple est une approche en deux passes :
    - d'abord faire une première lecture pour connaître les infos à mettre dans tous les fichiers en début et fin, et les garder en mémoire.
    - ensuite faire une deuxième passe qui fait le découpage, maintenant que tu sais ce qu'il faut mettre avant et après.

    Citation Envoyé par Lex92 Voir le message
    est ce que Stax est la meilleure façon de procéder dans mon cas?
    Probablement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Bonjour Thelvin,

    Merci pour ta réponse rapide.

    C'est exactement ce que j'essaye de faire actuellement, c'est à dire lire le fichier 2 fois pour récupérer d'abord l'entete et la fin, puis la seconde fois pour mon découpage.

    Le problème, c'est que je ne sais pas sous quelle forme récupérer le début et la fin de fichier afin de pouvoir ensuite l'utiliser dans mon XMLEventWriter?

    Si je comprends bien ta logique, le mieux ce serait que je crée une liste pour les XMLEvent du début, une liste pour les XMLEvent de la fin, puis à la second boucle sur le gros fichier à parser, avant meme de continuer à le lire pour récupérer les éléments de ma liste de data, je fais d'abord un parcours de la liste qui contient les éléments d'entete en faisant un writer.add pour chaque élément, puis le découpage, puis le parcours de ma liste de fin avec mon writer.add?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ben, oui -_-°.
    Après tu les enregistres bien sous la forme que tu veux, c'est pas important. Mais ça c'est la forme la plus directe et la plus facile. Je prends les trucs et je les garde dans un coin pour les redonner pareils plus tard. C'est sans faille.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Par défaut
    Ok, je vais implémenter ça comme ça, je reviens si je rencontre des blocages.

    Merci pour ton conseil rapide, ça me conforte dans l'idée d'utiliser stax pour faire cette moulinette

Discussions similaires

  1. 1 fichier xml en plusieurs fichiers xml
    Par morinxav1 dans le forum VBScript
    Réponses: 3
    Dernier message: 30/01/2014, 14h26
  2. 1 fichier xml vers plusieurs fichiers xml.
    Par gryps dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 05/11/2012, 13h58
  3. Diviser un fichier XML en plusieurs fichiers XML avec XSLT
    Par bobkorn dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/04/2008, 12h13
  4. Decomposé un fichier XML en plusieurs fichiers XML sous python
    Par elhout dans le forum Général Python
    Réponses: 6
    Dernier message: 12/03/2007, 14h20
  5. [XSLT] transfo d'un fichier XML en plusieurs fichiers XML
    Par doudou_rennes dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 28/11/2006, 12h01

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