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

ASP.NET Discussion :

Problème avec mon xml


Sujet :

ASP.NET

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut Problème avec mon xml
    Tout d'abord bonjour à tous, je suis tout nouveau sur ce forum, je ne sait pas si je poste dans la bonne section, veuillez m'en excuser.
    Je développe actuellement un site Web en asp.net et il se trouve que j'ai un problème.

    Je voudrais créer un fichier XML avec cette structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="utf-8"?>
    <Racine>
      <Profil id="test">
        <option1>False</option1>
        <option2>True</option2>
      </Profil>
      <Profil id="test2">
        <option1>False</option1>
        <option2>True</option2>
      </Profil>
    </Racine>
    Et je voudrais rajouter un (ou des, le nombre de profil n'étant pas fixe) nouveau profil et ces options à la suite.
    J'ai essayé de la manière suivante :

    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
     xmlDoc.Load(strFilename);
     
                        XmlElement elmRoot = xmlDoc.DocumentElement;
                        XmlElement elmProfil = xmlDoc.CreateElement("Profil");
                        XmlElement elmopt1 = xmlDoc.CreateElement("option1");
                        // Ajouter l'attribut Id.
                        XmlAttribute newAttr = xmlDoc.CreateAttribute("id");
                        newAttr.Value = TextBoxName.Text;
                        elmProfil.Attributes.Append(newAttr);
                        //Noeud Profil
                        XmlText Profil = xmlDoc.CreateTextNode("true");
                        elmRoot.AppendChild(elmProfil);
                        elmRoot.LastChild.AppendChild(Profil);
                        elmRoot.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
    //Noeud  opt1
                        XmlText opt1= xmlDoc.CreateTextNode(Checkboxcalldate.Checked.ToString());
                        elmRoot.AppendChild(elmopt1);
                        elmRoot.LastChild.AppendChild(opt1);
                        elmRoot.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
                        elmRoot.AppendChild(xmlDoc.CreateWhitespace("\r\n"));
     
                        xmlDoc.Save(strFilename);
    Avec ce code j'obtiens une structure de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Racine>
      <Profil id="test">true</Profil>
    		<opt1>False</opt1>
    		
    </Racine>
    J'ai vraiment un problème avec le nœud profil, je le crée avec xmlElement, alors que je pense qu'il faudrait avec un xmlNode mais je n'y arrive pas. Je voudrait d'abord réussir à avoir la bonne structure.

    Je vous remercie d'avance de votre aide

  2. #2
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Tu devrais faire appel à la serialisation XML d'objets. Cela permet de créer des fichiers XML à partir d'objets .Net.

    En pratique:
    1. Tu créés un objet métier (une classe) sérialisable
    2. Tu le serialise au format XML
    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
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Configuration;
    using System.Xml.Serialization;
    using System.IO;
     
    namespace ConsoleApplication
    {
        public class Program
        {
            [Serializable]
            public class Profil
            {
                [XmlAttribute]
                public string id;
                public bool option1;
                public bool option2;
            }
     
            static void Main(string[] args)
            {
                Profil p = new Profil();
                p.id = "ABC123";
                p.option1 = true;
                p.option2 = false;
     
                List<Profil> liste = new List<Profil>();
                liste.Add(p);
                liste.Add(p);
                liste.Add(p);
     
                XmlSerializer serializer = new XmlSerializer(typeof(List<Profil>), new XmlRootAttribute("root"));
                using (MemoryStream mem = new MemoryStream())
                {
                    serializer.Serialize(mem, liste);
     
                    using (FileStream fs = new FileStream("C:\\temp\\test.xml", FileMode.Create))
                    {
                        using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
                        {
                            sw.Write(Encoding.UTF8.GetString(mem.ToArray()));
                        }
                    }
                }
                Console.WriteLine("Done. Press a key.");
                Console.ReadLine();
            }
        }
    }
    Ce qui donne
    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
    <?xml version="1.0"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Profil id="ABC123">
        <option1>true</option1>
        <option2>false</option2>
      </Profil>
      <Profil id="ABC123">
        <option1>true</option1>
        <option2>false</option2>
      </Profil>
      <Profil id="ABC123">
        <option1>true</option1>
        <option2>false</option2>
      </Profil>
    </root>
    Le gros avantage de cette méthode c'est que tu peux en plus faire l'opération inverse de recréer ta liste d'objets à partir du XML.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Par défaut
    Salut,

    Pour revenir sur la méthode xml, tu ajoutes l'option sur le mauvais élément. Tu places l'option sur elmRoot, c'est à dire la racine. Il faudrait la mettre sur le noeud Profil.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    ok, je vais essayer vos deux solutions et je vous tiens au courant, je vous remercie

  5. #5
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    Merci problème résolu mais j'ai de nouveau un problème,

    je voudrai pouvoir ajouter un nouveau nœud profil avec un id différent du premier, j'ai essayé avec p.AddRange(liste), ou un p.insert(p) mais ca me rajoute le nouveau nœud avec les même information et/ou ca m'écrase le premier nœud.

    De plus je ne sais pas combien de nœud au total j'utiliserai, je voudrais faire une boucle qui m'ajoute un nœud à chaque fois que je clique sur mon bouton.

  6. #6
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Qu'est-ce que tu entends par noeud? Tu veux dire un élément "Profil"? As-tu essayé la solution que je t'ai présenté? Avec elle, il te suffit d'ajouter un élément à la liste et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                List<Profil> liste = new List<Profil>();
                liste.Add(p);
                liste.Add(p);
                liste.Add(p);
    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    oui e l'ai fait ca, mais ca m'ajoute à chaque fois le même élément "Profil" avec le même id.

    En faite je rentre mon id dans une textbox :

    mais je voudrais avoir plusieurs élément profil avec un id différent du genre :

    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
    <?xml version="1.0"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Profil id="ABC123">
        <option1>true</option1>
        <option2>false</option2>
      </Profil>
      <Profil id="test">
        <option1>true</option1>
        <option2>false</option2>
      </Profil>
      <Profil id="Profil1">
        <option1>true</option1>
        <option2>false</option2>
      </Profil>
    </root>
    en faisant ta solution j'ai toujours le même id.
    J'ai trouvé une solution mais ca me remet l'entête xml à chaque fois et du coup ce n'est pas pratique et pas "joli" à tester par la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Profil id="test">
        <option1>false</option1>
        <option2>false</option2>
      </Profil>
    </root><?xml version="1.0"?>
    <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Profil id="profil">
        <option1>true</option1>
        <option2>true</option2>
      </Profil>
    </root>
    Pour cela j'ai sortie le serializer et le list que j'ai mis dans la page_load :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void Page_Load(object sender, EventArgs e)
        {
            liste = new List<Profil>();
            serializer = new XmlSerializer(typeof(List<Profil>), new XmlRootAttribute("root"));
        }
    Ensuite j'ai gardé le reste du code que tu m'a donné plus haut, et j'ai passé changer l'opion du fileMode en Append pour lire le fichier ou écrire dedans s'il existe (le Create m'écraser le précédant à chaque fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using (FileStream fs = new FileStream(@"C:\inetpub\wwwroot\test\App_Data\XMLprofil.xml", FileMode.Append))

  8. #8
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Ben oui, mais il faut réflechir et essayer de comprendre un petit peu...

    Bon...

    Si tu veux des "Profil" différent c'est pas bien compliqué, il faut évidement les créer. Là j'en ai fait qu'un.
    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
    List<Profil> liste = new List<Profil>();
    Profil p = new Profil();
    p.id = "ABC123";
    p.option1 = true;
    p.option2 = false;
    liste.Add(p);
     
    Profil p2 = new Profil();
    p2.id = "test";
    p2.option1 = true;
    p2.option2 = false;
    liste.Add(p2);
     
    Profil p3 = new Profil();
    p3.id = "Profil1";
    p3.option1 = true;
    p3.option2 = false;
    liste.Add(p3);
    Le reste du code ne change pas.

    Tu ne peux pas utiliser un Append sur le fichier car tu vas ajouter ton XML au bout de l'autre et il sera mal formé.

    Pour pouvoir en ajouter, tu recharges tes profils en deserialisant ton fichier XML en une liste de profils. La procédure inverse quoi. Je te laisse chercher un petit peu? Une fois que tu as ta liste de Profils, tu peux chercher/modifier/supprimer/ajouter ce que tu veux et sérialiser de nouveau à la fin pour obtenir simplement ton fichier XML.

    C'est pour faire quoi au juste? Tu comptes en mettre combien les uns à la suite des autres?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 8
    Par défaut
    J'avais bien compris qu'en recréant des profils je pouvais en avoir des différents,
    mais le nombre de profil n'est pas décidé, je peux en avoir de 1 à 50 ...
    De plus je rentre les informations grâce à une page ou je rentre le nom du profil dans une TextBox, et les valeurs de mes options sont définies par les valeurs de checkbox, du coup j'utilise la même instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     p.id = TextBoxName.Text;
    pour chaque profil (pareil pour les options).

    Je débute encore, j'ai pas mal de soucis ^^ je vais me penché sur la déserialisation que je n'ai pas encore très bien compris, l'aide de msdn n'est pas toujours très clair mais je vais regardez plus en détails.

    En tout cas je te remercie de ton aide, tu m'éclaire bien même si j'ai du mal à me faire comprendre.

Discussions similaires

  1. Problème avec mon fichier web.xml
    Par snake264 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 10/09/2011, 18h25
  2. problème avec mon lecteur CD
    Par leo13 dans le forum Périphériques
    Réponses: 3
    Dernier message: 16/08/2005, 11h21
  3. [Tomcat] Problème avec web.xml
    Par hichamus dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/03/2005, 16h57
  4. Problème avec mon firewall ...
    Par Wis dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 06/04/2004, 08h46

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