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

C# Discussion :

C# et modification d'un fichier XML


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut C# et modification d'un fichier XML
    Bonjour à tous.

    Je m'arrache les cheveux depuis un petit moment sur un truc tout con.
    A partir d'un fichier xml pré-existant ayant la structure suivante :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
      <child1>value1</child1>
      <child2>value2</child2>
      <child4>value4</child4>
      <child5>value5</child5>
    </root>

    Je voudrais insérer une node <child3>value3</child3> entre child2 et child4 pour obtenir ça :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <root>
      <child1>value1</child1>
      <child2>value2</child2>
      <child3>value3</child3>
      <child4>value4</child4>
      <child5>value5</child5>
    </root>

    Mon problème, c'est que la bibliothèque System.Xml propose les méthodes qui ne génèrent pas les indentations et retours à la ligne adéquat.

    Avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    XmlDocument docXML = new XmlDocument();
    docXML.Load(fileXML);
    XmlNode root = docXML.DocumentElement;
    XmlNode child2Node = root.SelectSingleNode("child2");
    XmlNode child3Node = docXML.CreateElement("child3");
    child3Node.InnerText = value3;
    root.InsertAfter(child3Node, child2Node);
    Je me retrouve avec ça :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
      <child1>value1</child1>
      <child2>value2</child2><child3>value3</child3>
      <child4>value4</child4>
      <child5>value5</child5>
    </root>

    De la même manière, avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    XmlDocument docXML = new XmlDocument();
    docXML.Load(fileXML);
    XmlNode root = docXML.DocumentElement;
    XmlNode child4Node = root.SelectSingleNode("child4");
    XmlNode child3Node = docXML.CreateElement("child3");
    child3Node.InnerText = value3;
    root.InsertBefore(child3Node, child4Node);
    Je me retrouve avec ça :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
      <child1>value1</child1>
      <child2>value2</child2>
      <child3>value3</child3><child4>value4</child4>
      <child5>value5</child5>
    </root>

    Je retrouve le même problème avec la méthode AppendChild si j'essaie d'insérer ma node sans me soucier de sa position précise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    XmlDocument docXML = new XmlDocument();
    docXML.Load(fileXML);
    XmlNode root = docXML.DocumentElement;
    XmlNode child3Node = docXML.CreateElement("child3");
    child3Node.InnerText = value3;
    root.AppendChild(child3Node);
    ce qui donne ça :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root>
      <child1>value1</child1>
      <child2>value2</child2>
      <child4>value4</child4>
      <child5>value5</child5>
    <child3>value3</child3></root>

    Y a-t'il quelque chose que je n'ai pas pris en compte?

    Merci de votre aide.

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Deux choses à dire par rapport à cela.

    Tout d'abord, ce n'est pas parce qu'il n'y a pas l'indentation que le XML n'est pas valide. Donc à moins d'avoir besoin d'afficher le XML pour qu'il soit lu par un humain, il n'y a aucun soucis.

    Ensuite, le XML ne se limite pas à tes éléments. Il peut y avoir du texte, des commentaires, des CDATA, etc... Et donc, si tu souhaites gérer l'indentation, il faut que tu le fasses toi-même. Quand tu lui ajoute le noeud "child3", tu utilises un InsertAfter. La bibliothèque fait donc ce que tu lui demandes. Il faut insérer d'autres types de noeud, comme un noeud texte (avec CreateTextNode), qui contiendrait un retour à la ligne et le nombre d'espace/tabulation désiré.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par François DORIN Voir le message
    Tout d'abord, ce n'est pas parce qu'il n'y a pas l'indentation que le XML n'est pas valide. Donc à moins d'avoir besoin d'afficher le XML pour qu'il soit lu par un humain, il n'y a aucun soucis.


    Pour ce qui est de la suite, il y a plus simple : demander à ce que la sortie soit indentée automatiquement à l'aide de la classe XmlWriterSettings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    XmlWriterSettings settings = new XmlWriterSettings
    {
        Indent = true
    };
    using (XmlWriter writer = XmlWriter.Create("chemin/vers/fichier", settings))
    {
        docXML.Save(writer);
    }

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut
    Merci pour ces précisions.

    Effectivement, le XML doit être affiché pour des humains, il doit aussi être lu et traité par d'autres programmes et je ne voudrais pas glisser une coquille par négligence qui pourrait générer des erreurs en cascade par la suite, d'où mon envie de placer mes noeuds à des endroits précis et indentés convenablement.

    Si je résume bien, vous me dites qu'en réalité, le XML a cette apparence là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <root><node_retour_chariot/><node_espace/><child1>value1</child1><node_retour_chariot/><node_espace/><child2>value2</child2><node_retour_chariot/><node_espace/><child4>value4</child4><node_retour_chariot/><node_espace/><child5>value5</child5><node_retour_chariot/></root>
    C'est logique, mais je l'ignorais.
    Ceci dit, je ne comprends pas vraiment pourquoi les méthodes sus-mentionnées ne gèrent pas cela automatiquement...

    Sinon j'ai testé vos solutions : CreateTextNode marche à merveille contrairement à XmlWriterSettings qui ne change absolument rien au problème.

    Problème résolu donc

  5. #5
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par James Sunderland Voir le message
    C'est logique, mais je l'ignorais.
    Ceci dit, je ne comprends pas vraiment pourquoi les méthodes sus-mentionnées ne gèrent pas cela automatiquement...
    Je vois plusieurs raisons à cela :
    • il est difficile de déterminer, à partir d'un XML déjà existant, l'indentation à utiliser (programmatiquement parlant j'entend) ;
    • comme dit plus haut, l'indentation n'a pas de rôle sur la validé d'un XML, juste au niveau de sa présentation ;
    • gérer l'indentation nécessite des ressources supplémentaires quand le XML est traité (des noeuds supplémentaires donc une plus grande consommation de mémoire et des temps de traitements rallongés) ;
    • l'indentation augment la taille d'un fichier XML.


    Enfin, il existe des méthodes pour gérer l'indentation automatiquement, Winjerome en a donné un exemple. Mais comme je viens de le dire, cela nécessite des ressources supplémentaires qui ne sont pas requises la plupart du temps.

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Pourquoi tu ne passes pas par de la sérialisation ? Ce sera plus sécurisé pour faire des manipulations et tu pourras fixer le formatage à la volée en fonction de tes besoins. Tu peux regarder du côté des classes XmlSerializer et XmlTextWriter.

Discussions similaires

  1. modification d'un fichier xml
    Par DanielW33 dans le forum ANT
    Réponses: 1
    Dernier message: 09/10/2006, 16h38
  2. [DOM XML] Modification d'un fichier XML en php
    Par aldo-tlse dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 07/07/2006, 18h28
  3. [xml/xsl/xhtml] modification d'un fichier XML
    Par florent_de_brest dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 25/05/2006, 20h43
  4. [c#] Modification d'un fichier XML
    Par topolino dans le forum Windows Forms
    Réponses: 13
    Dernier message: 21/03/2006, 14h51
  5. [DOM] Modification d'un fichier XML
    Par nana1 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 21/11/2005, 23h22

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