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

VB.NET Discussion :

Modification fichier XML


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut Modification fichier XML
    Bonjour à tous, je dois repérer toutes les balises de fin (<\ >) dans des fichiers xml puis ajouter un CRLF après ces balises. Seulement les fichiers sont énormes et je me demande s'il y a une technique plus rapides qu'une autre pour le faire ?
    Il faut savoir aussi que les balises contiennent des noms différents (ex: </main>, </currencies>, ...)
    Merci pour votre aide.

  2. #2
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    J'essaye avec une expression régulières mais je ne suis pas trop fan.
    Est-ce que,éventuellement, quelqu'un pourrait me donner la bonne regex.
    truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Reg As New Regex("^(<\)(.*)(>)$")

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Si le le fichier en question est au format XML valide, tu peux l'enregistrer via XmlTextWriter, le paramètre Formating fera le travail à ta place.
    http://msdn.microsoft.com/fr-fr/libr...ormatting.aspx.

  4. #4
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par metos57 Voir le message
    Bonjour,

    Si le le fichier en question est au format XML valide, tu peux l'enregistrer via XmlTextWriter, le paramètre Formating fera le travail à ta place.
    http://msdn.microsoft.com/fr-fr/libr...ormatting.aspx.
    Cool, je ne connaissais pas, tu dis que Formatting fera le travail à ma place mais je ne pense pas qu'il puisse repérer toutes les fins de balises puis leur ajouter juste derrière le string de valeur "CRLF" ?

  5. #5
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Je suis vraiment en galère, mes tentatives ne servent à rien, comment puis-je ajouter VBCRLF après chaque fin de balises ?
    Par exemple : ... <\main>VBCRLF ...
    Please help me.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Pourquoi veux-tu faire ça ?

  7. #7
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Gold Bug Voir le message
    Pourquoi veux-tu faire ça ?
    C'est juste un ordre de mon patron alors j'obéis...:s

  8. #8
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Points : 311
    Points
    311
    Par défaut
    Ton patron il a des drôles d'idées.
    La plupart des éditeurs XML font de la mise en forme de fichiers XML. Moi j'utilise Altova XMLSpy qui a un fonction "pretty print" qui marche super bien !
    Il ajoute les sauts de lignes et fait l'indentation des balises automatiquement.

  9. #9
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Gold Bug Voir le message
    Ton patron il a des drôles d'idées.
    La plupart des éditeurs XML font de la mise en forme de fichiers XML. Moi j'utilise Altova XMLSpy qui a un fonction "pretty print" qui marche super bien !
    Il ajoute les sauts de lignes et fait l'indentation des balises automatiquement.
    Je sais que ça n'a pas de sens mais on travaille avec des anciens programmes et ces programmes demandent une certaines mise en forme.
    Les lignes des fichiers XML n'en finissent pas, mon boss m'a demandé de mettre un retour chariot a chaque fin de balise pour que ses anciens programmes reconnaissent la mise en forme.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Points : 253
    Points
    253
    Par défaut
    Si votre patron a toujours raison, et que vous ne vous pouvez pas vous permettre de lui demontrer le contraire, ce bout de code qui suit que je viens d'ecrire et tester devrait aider.

    Notez que c'est ecrit pour avoir de bonnes performances sur de tres gros fichiers, sans devoir "sucer" tous le XML en memoire (le probleme qu'on a si on passe par les APIs XML .NET classiques ou si on travaille avec des expressions regulieres sur le texte).

    Cependant :

    * c'est du C#, faudra adapter pour VB.NET (désolé, je suis plus fluent en C# qu'en VB...)

    * pour des perfs encore meilleures, faudra re ecrire mes string.Concat en utilisant un StringBuilder a la place, pour le StreamWriter (sw) ; je vous laisse ca en exercice..

    * faudra adapter egalement si vous voulez ajouter CRLF apres les tags sans enfants du type "<foobar/>" (vous ne nous avez pas precisé pour ce cas particulier...)

    'HTH

    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
     
                StreamWriter sw = new StreamWriter("d:\\app\\append_crlf\\append_crlf\\result.xml");
                using (StreamReader sr = new StreamReader("d:\\app\\append_crlf\\append_crlf\\test.xml"))
                {
                    string line = sr.ReadLine();
                    bool lineDone = false;
                    while (!sr.EndOfStream || !lineDone)
                    {
                        if(lineDone)
                            line = sr.ReadLine();
                        if (String.IsNullOrEmpty(line))
                            continue;
                        int endTagMarkIndex = line.IndexOf("</"); // on cherche "...</..."
                        if (endTagMarkIndex >= 0)
                        {
                            string head = line.Substring(0, endTagMarkIndex);
                            string endTagTail = line.Substring(endTagMarkIndex + 2); // recup de "...>..." apres "</"
                            int endTagEnd = endTagTail.IndexOf('>'); // index de ">" dans tail
                            string newEndTag = String.Concat(
                                "</",
                                endTagTail.Substring(0, endTagEnd), // nom du tag dans "</nomDuTag>"
                                ">",
                                "\r\n");
                            string newLine = String.Concat(head, newEndTag);
                            sw.Write(newLine);
                            line = endTagTail.Substring(endTagEnd + 1);
                            lineDone = (line == String.Empty);
                        }
                        else
                        {
                            sw.WriteLine(line);
                            lineDone = true;
                        }
                    }
                }
                sw.Close();
    Citation Envoyé par eikeshi Voir le message
    C'est juste un ordre de mon patron alors j'obéis...:s

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Points : 253
    Points
    253
    Par défaut
    (Juste pour info)

    Avec ma solution (warning : bricolée vite faite ; à tester un peu plus), à partir par exemple de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?xml version="1.0" ?>
    <root><a><b>.....</b><foo/></a>mmm</root>
    on obtient cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?xml version="1.0" ?>
    <root><a><b>.....</b>
    <foo/></a>
    mmm</root>
    [ EDIT ]
    NB : je NE recommande cependant PAS, en général, de "parser" "à la main" de la sorte des jeux de données XML y compris (surtout) pour y faire des transformations ; toujours préférer, a priori, l'utilisation des composants de System.Xml, System.Xml.Xsl, etc ; mais dans votre cas, si les fichiers sont vraiments gros (j'ai pris pour hypothèse plusieurs dizaines de Mo, par exemple), je reconnais qu'on doit peut etre mettre les mains dans ce genre de "cambouis".

    'HTH

    Citation Envoyé par lysiandad Voir le message
    Si votre patron a toujours raison, et que vous ne vous pouvez pas vous permettre de lui demontrer le contraire, ce bout de code qui suit que je viens d'ecrire et tester devrait aider.

    Notez que c'est ecrit pour avoir de bonnes performances sur de tres gros fichiers, sans devoir "sucer" tous le XML en memoire (le probleme qu'on a si on passe par les APIs XML .NET classiques ou si on travaille avec des expressions regulieres sur le texte).

    Cependant :

    * c'est du C#, faudra adapter pour VB.NET (désolé, je suis plus fluent en C# qu'en VB...)

    * pour des perfs encore meilleures, faudra re ecrire mes string.Concat en utilisant un StringBuilder a la place, pour le StreamWriter (sw) ; je vous laisse ca en exercice..

    * faudra adapter egalement si vous voulez ajouter CRLF apres les tags sans enfants du type "<foobar/>" (vous ne nous avez pas precisé pour ce cas particulier...)

    'HTH

    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
     
                StreamWriter sw = new StreamWriter("d:\\app\\append_crlf\\append_crlf\\result.xml");
                using (StreamReader sr = new StreamReader("d:\\app\\append_crlf\\append_crlf\\test.xml"))
                {
                    string line = sr.ReadLine();
                    bool lineDone = false;
                    while (!sr.EndOfStream || !lineDone)
                    {
                        if(lineDone)
                            line = sr.ReadLine();
                        if (String.IsNullOrEmpty(line))
                            continue;
                        int endTagMarkIndex = line.IndexOf("</"); // on cherche "...</..."
                        if (endTagMarkIndex >= 0)
                        {
                            string head = line.Substring(0, endTagMarkIndex);
                            string endTagTail = line.Substring(endTagMarkIndex + 2); // recup de "...>..." apres "</"
                            int endTagEnd = endTagTail.IndexOf('>'); // index de ">" dans tail
                            string newEndTag = String.Concat(
                                "</",
                                endTagTail.Substring(0, endTagEnd), // nom du tag dans "</nomDuTag>"
                                ">",
                                "\r\n");
                            string newLine = String.Concat(head, newEndTag);
                            sw.Write(newLine);
                            line = endTagTail.Substring(endTagEnd + 1);
                            lineDone = (line == String.Empty);
                        }
                        else
                        {
                            sw.WriteLine(line);
                            lineDone = true;
                        }
                    }
                }
                sw.Close();

  12. #12
    Membre du Club Avatar de eikeshi
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 73
    Points : 61
    Points
    61
    Par défaut
    Merci beaucoup, ta solution marche à merveille, voici le code en VB si ça interesse :
    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
     
    sw = New StreamWriter(sRepertoire2)
            Using sr As StreamReader = New StreamReader(sRepertoire)
                sligne = sr.ReadLine
                bligne = False
                While (sr.EndOfStream <> False Or bligne <> True)
                    If bligne Then
                        sligne = sr.ReadLine
                    End If
                    If (String.IsNullOrEmpty(sligne)) Then
                        Continue While
                    End If
                    endTagMarkIndex = sligne.IndexOf("</")
                    If (endTagMarkIndex >= 0) Then
                        head = sligne.Substring(0, endTagMarkIndex)
                        endTagTail = sligne.Substring(endTagMarkIndex + 2)
                        endTagEnd = endTagTail.IndexOf(">")
                        newEndTag = String.Concat("</", endTagTail.Substring(0, endTagEnd), ">", vbCrLf)
                        newsLigne = String.Concat(head, newEndTag)
                        sw.Write(newsLigne)
                        sligne = endTagTail.Substring(endTagEnd + 1)
                        bligne = (sligne = String.Empty)
                    Else
                        sw.WriteLine(sligne)
                        bligne = True
                    End If
                End While
            End Using
            sw.Close()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML] modification fichier xml
    Par stomerfull dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 10/02/2010, 14h57
  2. Parsing et modification fichier xml
    Par Premium dans le forum Modules
    Réponses: 2
    Dernier message: 02/12/2008, 15h49
  3. Modification fichier XML
    Par pitch21 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 03/11/2008, 08h39
  4. Modification fichier xml
    Par Jasou62114 dans le forum Web
    Réponses: 6
    Dernier message: 23/01/2008, 15h42
  5. [VB.NET] modification fichier XML
    Par betaphp dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/11/2005, 11h13

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