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

Dotnet Discussion :

Transformation XML - Problème de taille de fichier


Sujet :

Dotnet

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 38
    Points
    38
    Par défaut Transformation XML - Problème de taille de fichier
    Bonjour à tous.

    Je viens de créer un outil permettant de splitter un fichier XML qui contient plusieurs types de noeuds, en différents fichiers.

    Voici un exemple pour mieux comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <root>
       <Vendeur>
          <Nom>DURAND</Nom>
          <Prenom>TOTO</Prenom>
       </Vendeur>
       <Client>
          <Nom>DUPONT</Nom>
          <Prenom>TATA</Prenom>
       </Client>
    </root>
    Ainsi, l'outil permet de créer un fichier xml contenant tous les noeuds "Vendeur" et un autre fichier contenant tous les noeuds "Client"

    Je travaille sur un fichier XML de 378 Mo.

    Et lors de l'extraction d'un des types de noeuds (il y a environ 40000 noeuds sur un peu plus de 1 million de lignes en comptant les noeuds enfants), le fichier final que j'obtiens est plus gros que l'original... (390Mo pour le fichier transformé contre 378Mo pour l'original), alors que ce fichier contient bien moins de noeuds que l'original...

    Je ne comprends pas d'où peut venir le problème...

    Si quelqu'un peut m'aider, je suis preneur.....

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Il faudrait que tu donnes plus de détails, un bout de code par exemple...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 38
    Points
    38
    Par défaut
    Explication du focntionnement :

    Je charge en mémoire, dans la variable xmlFile1 mon fichier XML (378Mo) - ce qui, pour info, fait monter la mémoire utilisée à environ 750Mo, donc le double de la taille de départ.
    Je renseigne un niveau de noeuds à parcourir, à partir duquel je vais lister les différents noeuds (je crée un xpath dynamiquement en fonction du niveau renseigné).

    Par exemple,
    si je renseigne "niveau 2", je vais lister "Vendeur" et "Client"
    si je renseigne "niveau 3", je vais lister "Nom" et "Prénom"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <root>
       <Vendeur>
          <Nom>DURAND</Nom>
          <Prenom>TOTO</Prenom>
       </Vendeur>
       <Client>
          <Nom>DUPONT</Nom>
          <Prenom>TATA</Prenom>
       </Client>
    </root>
    Cette liste s'affiche sur mon webform sous forme de RadioButttons, et je peux donc choisir un type de noeuds à splitter.

    Voici donc le bout de code renseigné :


    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
     
            private void bt_split_1_file_Click(object sender, EventArgs e)
            {
                // Nom du type de noeud à splitter
                string nodeToSplit = string.Empty;
     
                // Récupération du nom sélectionné dans les radiobuttons (nom des noeuds à comparer)
                foreach (Control ctrl in panel1.Controls)
                {
                    if (ctrl is RadioButton)
                    {
                        if ((ctrl as RadioButton).Checked == true)
                        {
                            nodeToSplit = ctrl.Text;
                            selectedRadioButton = nodeToSplit;
                            break;
                        }
                    }
                }
     
     
                string splitXpath = ".";
                int i = 1;
     
                //xmlNodeLevel est le niveau renseigné dans le Winform
                while (i < xmlNodeLevel)
                {
                    splitXpath += "/*";
                    i++;
                }
     
                splitXpath = splitXpath.Substring(0, splitXpath.Length - 1) + nodeToSplit;
     
                string currentNodeName = string.Empty;
     
                XmlDocument xmlSplit = new XmlDocument();
     
                //Création du noeud Root
                xmlSplit.LoadXml("<Root></Root>");
                xmlSplit.CreateXmlDeclaration("1.0", "UTF8", null);
     
                foreach (XmlNode currentNode in xmlFile1.DocumentElement.SelectNodes(splitXpath,mgr1))
                {
                    if (currentNode.Name != currentNodeName)
                    {
                        currentNodeName = currentNode.Name;
                        XmlNode newNode = xmlSplit.ImportNode(currentNode, true);
                        xmlSplit.DocumentElement.AppendChild(newNode);
                    }
                    else
                    {
                        XmlNode newNode = xmlSplit.ImportNode(currentNode, true);
                        xmlSplit.DocumentElement.AppendChild(newNode);
                    }               
                }
     
               //Sauvegarde du nouveau document généré avec un nom reprenant le nom d'origine du fichier avec "_split_....." derrière et l'enregistre au même endroit que le fichier d'origine.
                xmlSplit.Save(textBox1.Text.Substring(0, textBox1.Text.Length - 4) + "_split_" + currentNodeName.Substring(currentNodeName.LastIndexOf(":") + 1) + ".xml");
                MessageBox.Show("Split des fichiers terminé avec succès");
            }

    En espèrant trouver une solution.......

    ++

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bizarre... ce serait pas un problème d'encodage ? par exemple, si le fichier est enregistré en UTF-16, c'est normal que ça prenne 2 fois plus de place...
    En plus tu crées un noeud XmlDeclaration, mais tu ne l'ajoutes pas au document, donc le "UTF8" que tu spécifies n'est pas pris en compte (d'ailleurs c'est "UTF-8", avec un tiret). Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    XmlDeclaration decl = xmlSplit.CreateXmlDeclaration("1.0", "UTF8", null);
    xmlSplit.InsertBefore(decl, xmlSplit.DocumentElement);

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 64
    Points : 38
    Points
    38
    Par défaut
    Merci pour l'info.
    Je vais tester...

    Mon problème avait lieu aussi quand je ne mettais pas de ligne d'en-tête.

    Je vais tester et je reposte pour donner le résultat !!

    Encore merci !

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par nono27200 Voir le message
    Mon problème avait lieu aussi quand je ne mettais pas de ligne d'en-tête.
    Ben dans le code que tu as posté, tu n'en mets pas de toutes façons... tu crées la déclaration sans l'ajouter au document, donc c'est pareil que si tu ne la créais pas du tout

Discussions similaires

  1. [JDOM] Ecriture fichier xml: Problème de taille
    Par bipbipman2003 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 22/07/2009, 15h21
  2. problème de taille de fichier Excel
    Par flore.darras dans le forum Langage
    Réponses: 2
    Dernier message: 12/06/2007, 12h46
  3. Réponses: 4
    Dernier message: 08/09/2006, 12h21
  4. Réponses: 1
    Dernier message: 26/04/2006, 13h01
  5. [langage] Problème de taille de fichier à mettre dans
    Par And_the_problem_is dans le forum Langage
    Réponses: 10
    Dernier message: 13/08/2002, 10h41

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