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 :

Lire et écrire dans un fichier xml [Débutant]


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut Lire et écrire dans un fichier xml
    Bonjour,

    J'ai le fichier xml suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!--Définition du fond d'écran en fonction du groupe et de l'utilisateur-->
    -<groupe> 
      -<agence nom="MonAgence"> 
          -<Utilisateur> 
               <prenom>Sheira</prenom> 
               <fond>fond1.jpg</fond> 
         </Utilisateur> 
      </agence> 
    </groupe>
    J'aimerai lire le fichier de façon à:

    1) récupérer la valeur de l'attribut nom de l'agence (ici: MonAgence)
    2) récupérer le prenom et le fond de l'Agence (MonAgence) en question


    J'aimerai pouvoir écrire dans le fichier de façon à:

    1)Si je ne trouve pas le bon nom d'agence, j'aimerai pouvoir rajouter de nouveau noeud "Agence" dans le groupe avec un noeud utilisateur fond

    2) si je trouve la bonne agence, je veux pouvoir rajouter uniquement un noeud utilisateur si je ne trouve pas l'utilisateur en question.

    J'espère avoir été assez clair.

    Voilà comment je procède pour récupérer mes valeur mais ça ne fonctionne pas, ma dernière instruction ne m'affiche rien:
    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
    <% @Page Language="C#" Debug="true" %>
    <% @Import Namespace="System" %>
    <% @Import Namespace="System.Xml" %>
    <% @Import Namespace="System.Xml.XPath" %>
    <% @Import Namespace="System.IO" %>
     
    <%
    //public searchBackGround(string groupe, string utilisateur)
     
    {
     
    	//Pour Lire
    	String filename = "fond.xml";
    	XPathDocument docXml = new XPathDocument(HttpContext.Current.Server.MapPath(filename));
    	XPathNavigator lir = docXml.CreateNavigator();
    	XPathNodeIterator iterateur = lir.Select("groupe");
     
    	while (iterateur.MoveNext())
    	{
    		Console.WriteLine(iterateur.Current.SelectSingleNode("agence").Value);	
     
    	}
     
     
    }
     
     
    %>
    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    ce que tu essayes de lire est un attribut utilise la classe XmlAttribute pour récupérer cette donnée, sinon pour tout ce qui est recherche je te conseil d'utiliser LinqToXML qui t'évitera de taper des gros pavés pour tes recherches

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Auriez-vous des exemples je suis une novice en programmation C#?
    Est-ce que LinkToXml est disponible avec n'importe quelle version du framework?

    Merci d'avance.

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte C#
    Inscrit en
    Février 2003
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte C#

    Informations forums :
    Inscription : Février 2003
    Messages : 78
    Points : 144
    Points
    144
    Par défaut
    Depuis la version 3 ou 3.5, oui, c'est intégré en standard.

    Un petit exemple d'utilisation ici :
    http://blog.developpez.com/index.php...le=linq_to_xml

    et une plus ample définition provenant du msdn là:
    http://msdn.microsoft.com/fr-fr/library/bb387061.aspx

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Ok pour utiliser LinqToXml.

    Par contre voilà l'erreur que j'ai :
    Le type ou le nom d'espace de noms 'Linq' n'existe pas dans l'espace de noms 'System.Xml' (une référence d'assembly est-elle manquante ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne 4 :  <% @Import Namespace="System.Xml.Linq" %>
    Alors que j'ai la version 3.5.1 du Framework .Net??

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    fait un clique droit sur ton projet -> Ajouter une référence et dans l'onglet .net choisi System.Xml.Linq

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Je n'ai pas Visual Studio. Comment faire autrement?

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu codes avec quoi? il doit y avoir un autre moyen d'importer les dll dont t'as besoin

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    J'utilise NotePad++

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    je sais que tu peux la trouver à cet endroit:
    C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5
    essaye de copier les 2 fichiers System.Xml.Linq au niveau du répertoire de ton application, ou peut être qu'au niveau du compilateur il y a des options pour ajouter des assemblies à ton application au moment de la compilation

    pourquoi tu n'utilises pas visual studio?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    Je n'ai pas ce répertoire.
    Et quand je fais une recherche de la librairie en question: System.Xml.Linq.dll j'en ai de partout, mais principalement dans le répertoire C:\Windows\winsxs

    Que faire? Quels sont les fichiers à copier dans le repertoire de mon site?

    N'existe-il pas une autre façon de procéder sans ce Xml.Linq?

    Je travaille sur un serveur hébergé, nous n'avons pas Visual Studio d'installer parce que c'est le seul développement que nous envisageons en C#.

    Merci d'avance pour votre aide.

  12. #12
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    C'est parce que le "bon" répertoire c'est :

    C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 où la partie soulignée dépend du framework .net installé.

    Tu peux faire sans Linq ceci dit, par exemple :

    Code C# : 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
     
    using (System.IO.Stream inputStream = TonXML.OpenText().BaseStream)
                    {
                        if (ValidateXML(inputStream)) // Methode de validation à définir par ailleurs
                        {
                            inputStream.Position = 0;
                            string balise = null, val = null;
     
                            XmlReader XmlReader = XmlReader.Create(inputStream);
                            IFormatProvider Culture = new CultureInfo("fr-Fr", true);
     
                            while (XmlReader.Read())
                            {
                                try
                                {
                                    switch (XmlReader.NodeType)
                                    {
                                        case XmlNodeType.Element:
                                            balise = XmlReader.Name;
                                            break;
                                        case XmlNodeType.Text:
                                            val = XmlReader.Value;
                                            if (balise .Equals("groupe", StringComparison.CurrentCultureIgnoreCase))
                                            {
                                                // Faire quelquechose
                                            }
                                     }
                               }
                               catch(Exception) { }
                       }
                  }
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    sous le répertoire C:\Windows\Microsoft.NET\Framework\ j'ai le répertoire v2.050727 ... pas celui que vous indiquez et pourtant j'ai bien le framework 3.5.1 d'installé.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Er3van : XmlReader fournit un accès en avant uniquement et en lecture seule à un flux de données XML. Je ne peux donc pas l'utiliser pour écrire, insérer de nouveaux noeuds??
    J'ai vraiment besoin de pouvoir écrire et lire dans un fichier xml merci d'avance pour votre aide.

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par sheira Voir le message
    Bonjour,

    Je n'ai pas ce répertoire.
    Et quand je fais une recherche de la librairie en question: System.Xml.Linq.dll j'en ai de partout, mais principalement dans le répertoire C:\Windows\winsxs

    Que faire? Quels sont les fichiers à copier dans le repertoire de mon site?

    N'existe-il pas une autre façon de procéder sans ce Xml.Linq?

    Je travaille sur un serveur hébergé, nous n'avons pas Visual Studio d'installer parce que c'est le seul développement que nous envisageons en C#.

    Merci d'avance pour votre aide.
    essaye de copier les 2 dll que je t'ai cité (prend les de winsxs au pire) dans le répertoire de ton appli ou dans le répertoire bin de ton application, tu peux vraiment pas installer visual web developper express ?

  16. #16
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Je rebondis : si c'est votre seul développement en C#, pourquoi le faire en C# ?
    Quid des problématiques de maintenance ?

    Et comme le dit youtpout978, il existe des versions express gratuites.
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Ok je vais voir pour installer une version express gratuite. Merci!

    Parce que j'utilise le remote desktop web (RDWeb) de windows, je suis en train d' ajouter une fonctionnalité et vue que le programme est développé en C# je fais de même.

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    J'ai installer Visual Studio Express mais je n'arrive toujours pas...
    donc pour avancer j'ai commencé à créer ma fonction tout en me passant de Xml.Linq
    Voilà ce que ça 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
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    <% @Page Language="C#" Debug="true" %>
    <% @Import Namespace="System" %>
    <% @Import Namespace="System.Xml" %>
    <% @Import Namespace="System.IO" %>
    <% @Import Namespace="System.Xml.XPath" %>
     
    <%
     
     
    	try
     
    	{
    		String[] theArray = new string[] {"agence", "prenom", "fond"};
    		String[] r = { "agence1", "sheira", "fond1.jpg" };
     
    		String filename = "test.xml";
    		//FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate);
     
     
     
    		FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate, FileAccess.ReadWrite);
     
    		if (f.Length != 0)
     
    		{
     
    			XmlDocument doc = new XmlDocument();
     
    			doc.Load(f);
     
    			XmlNode racine = doc.DocumentElement;
     
    			if (racine.NodeType == XmlNodeType.Element && racine.Name == "groupe")
     
    			{
     
    				XmlNodeList childreen;
     
    				XmlNode child;
     
    				XmlNode agence;
     
    				XmlNode prenom;
     
    				XmlNode fond;
     
    				int i;
     
    				childreen = racine.ChildNodes;
     
    				for (i=0; i < childreen.Count; i++)
     
    				{
     
    					child = childreen.Item(i);
     
    					if (child.NodeType == XmlNodeType.Element)
     
    					{
     
    						if (child.Name == "agence")
     
    							agence = child;
     
    						if (child.Name == "prenom")
     
    							prenom = child;
     
    						if (child.Name == "fond")
     
    							fond = child;
     
    					}
     
    				}
     
    				XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "agence","agence");
    				//racine.Appenchild(newNode);
     
    				//doc.Save(f);
     
     
     
    			}
     
    			f.Close();
     
    		}
     
    		else
     
    		{
     
    			XmlTextWriter xmlw = new XmlTextWriter(f, System.Text.Encoding.UTF8);
     
    			xmlw.Formatting = Formatting.Indented;
     
    			xmlw.WriteStartDocument();
     
    			xmlw.WriteStartElement("groupe");
     
    			xmlw.WriteStartElement("agence", r[0]);
     
    			xmlw.WriteStartElement("utilisateur");
     
     
    			//int i = 1;
     
    			//foreach (string s in theArray)
    			for (int i=1; i< theArray.Length; i++) 
     
    			{
     
    				xmlw.WriteElementString(theArray[i], r[i]);
     
     
     
    			}
     
    			xmlw.WriteEndDocument();
     
    			xmlw.Flush();
    			//vide le buffer
     
    			xmlw.Close();
    			// Close the writer
     
     
    			//f.Flush();
    			f.Close();
    		}
     
     
    	}
     
     
     
    	finally {
     
     
    	 }
     
    %>
    J'arrive a créer mon fichier xml, maintenant je n'arrive pas a ajouter des noeuds <agence> à la suite.

    Comment faire pour rechercher et insérer des éléments dans un fichier XML.

    Merci d'avance pour votre aide.

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu as bien fait ça:
    fait un clique droit sur ton projet -> Ajouter une référence et dans l'onglet .net choisi System.Xml.Linq
    et ajoute un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <% @Import Namespace="System.Xml.Linq" %>
    pour ajouter des éléments à la suite je crois que c'est ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    xmlw.WriteStartElement("agence", r[0]);
    xmlw.WriteEndElement();
    xmlw.WriteStartElement("agence", r[0]);
    xmlw.WriteEndElement();

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    youtpout978, il s'agit d'un projet RDWeb, je n'arrive pas à l'ouvrir dans Visual C# 2010 Express.
    J'ai juste un répertoire avec des fichiers aspx.

    Pour l'ajout de nouveau éléments dans le document xml, j'ajoute bien les élément avec un XmlTextWriter mais ça me les ajoute à la fin du fichier. Comment lui dire de les rattacher à ma racine, ou a un autre de mes noeuds.
    Parce que là mon fichier XML devient incohérent.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="utf-8"?>
    <groupe>
      <agence nom="agence1">
        <utilisateur>
          <prenom>sheira</prenom>
          <fond>fond1.jpg</fond>
        </utilisateur>
      </agence>
    </groupe><agence nom="agence2"><Utilisateur><prenom>Lila</prenom><fond>fond2.jpg</fond></Utilisateur></agence>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Lire et écrire dans un fichier XML mutualisé!
    Par Invité dans le forum VB.NET
    Réponses: 3
    Dernier message: 27/10/2014, 10h19
  2. lire et écrire dans un fichiers de signature XML
    Par masterdash dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 17/01/2013, 21h19
  3. [XML/Glib/GTK+] Comment lire et écrire dans un fichier XML
    Par Skarsnick dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 19/08/2009, 09h20
  4. [Xerces] Lire et écrire dans un fichier XML
    Par sKy_92310 dans le forum XML
    Réponses: 4
    Dernier message: 24/01/2009, 19h44
  5. [Rech. Comp.] Lire et écrire dans des fichiers XML
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/08/2005, 20h48

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