Partage
  • Partager sur Facebook
  • Partager sur Twitter

Parcourir et remplir un fichier XML en C#

Débutante

    6 février 2012 à 11:09:08

    [QUOTE=sheira;6485086]Bonjour,

    J'ai le fichier xml suivant:
    <?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:
    <% @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[/QUOTE]

    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2012 à 11:57:31

      Tu devrais plutôt utiliser la classe XDocument, elle est bien plus facile d'utilisation.

      Par ailleurs apparemment tu écris ton code dans une page web, donc Console.WriteLine() ne risque pas d'afficher grand chose... :o
      • Partager sur Facebook
      • Partager sur Twitter
        6 février 2012 à 12:31:36

        Oui oui j'ai oublié de l'enlever c'était pour un autre test.
        Aurais-tu un exemple concret pour l'XDocument?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          6 février 2012 à 17:04:44

          Utilise XDocument.Load() pour en charger un, puis utilise LINQ-to-XML pour chercher ce que tu veux.
          Un exemple (LINQ n'est pas forcément très facile à comprendre même si c'est très puissant) :
          var document = XDocument.Load( file.OpenRead() );
          LocDictionary dic = document.Root.Elements( "Group" )
                              .ToDictionary( elem => elem.Attribute( "Id" ).Value,
                                             elem => elem.Elements( "String" ).ToDictionary( stringElem => stringElem.Attribute( "Key" ).Value,
                                                                                             stringElem => stringElem.Attribute( "Value" ).Value ) );
          

          Ici je récupère un double dictionnaire depuis un fichier XML ; tu vois comment on sélectionne le ou les attributs/éléments d'un noeud.
          • Partager sur Facebook
          • Partager sur Twitter
            7 février 2012 à 16:25:58

            J'ai pas vraiment compris ce que t'as fait... par contre voila comment j'ai commencé à coder ma fonction:

            <% @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.
            • Partager sur Facebook
            • Partager sur Twitter
              9 février 2012 à 9:43:26

              Bon ben j'ai continuer à avancer....


              J'arrive à rajouter des noeuds ou je veux.... le soucis c'est qu'il m'en rajoute tout le temps parce que je passe jamais au noeud suivant, j'ai pourtant une boucle fort mais rien n'y fait... je veux d'abord qui 'il vérifie que l'enregistrement n'existe dans aucun des noeuds avant de me le rajouter mais c'est pas le cas il s'arrête au premier noeud... merci d'avance pour votre aide.

              try
              
              	{
              		String[] theArray = new string[] {"utilisateur", "prenom", "fond"};
              		String[] r = { "agence1", "sheira", "fond1.jpg" };
              
              		String filename = "test2.xml";
              		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")
              			{
              				
              				// Get a list of elements whose names are Agence
              				XmlNodeList nodAgences = doc.GetElementsByTagName("agence");
              				// Since we will look for a specific agence, get the list of all prenom
              				XmlNodeList nodUsers = doc.GetElementsByTagName("utilisateur");
              				
              				// Visit each agences
              				for(int i = 0; i < nodAgences.Count; i++)
              				{
              				
              					if (((XmlElement)(nodAgences[i])).HasAttribute("nom")){
              						string nomAgence = ((XmlElement)(nodAgences[i])).GetAttribute("nom");
              						Response.Write(r[0] );
              							if (nomAgence == r[0]){
              								Response.Write("ok:agence ");							
              								//for(int j = 0; j < nodUsers.Count; j++){
              									String prenom = nodUsers[i].InnerText;
              									Response.Write(prenom);
              									if(prenom == "she")
              									{
              										Response.Write("ok:utilisateur ");
              										// l'utilisateur existe déjà 
              										string nomFond = ((XmlElement)(nodUsers[i])).GetAttribute("fond");
              										Response.Write(nomFond);
              									
              										if (nomFond != "fond2.jpg"){
              											Response.Write("ok:changeFond ");
              											// On modifie le fond => je remplace le noeud complet
              											XmlElement user = doc.CreateElement("utilisateur");
              											user.InnerText = "Lina";
              											XmlAttribute attrFond = doc.CreateAttribute("fond");
              											attrFond.Value = "fond2.jpg";
              											user.SetAttributeNode(attrFond);
              											nodUsers.Item(i).ParentNode.ReplaceChild(user, nodUsers.Item(i));
              										}
              									}
              									else {
              										Response.Write("ok:changeUser ");
              										// je rajoute le noeud complet
              										XmlElement user = doc.CreateElement("utilisateur");
              										user.InnerText = "Lila";
              										XmlAttribute attrFond = doc.CreateAttribute("fond");
              										attrFond.Value = r[2];
              										user.SetAttributeNode(attrFond);
              										nodAgences.Item(i).AppendChild(user);
              										
              									}
              								//}
              							}
              							else{
              								XmlElement ag = doc.CreateElement("agence");
              								XmlAttribute attrNom = doc.CreateAttribute("nom");
              								attrNom.Value = r[0];
              								ag.SetAttributeNode(attrNom);
              									
              								XmlElement user = doc.CreateElement("utilisateur");
              								user.InnerText = "Lila";
              								XmlAttribute attrFond = doc.CreateAttribute("fond");
              								attrFond.Value = r[2];
              								user.SetAttributeNode(attrFond);
              													
              								ag.AppendChild(user);
              								racine.InsertAfter(ag, racine.FirstChild);							
              							}							
              					}					
              				}
              				
              				f.Close();
              				doc.Save(HttpContext.Current.Server.MapPath(filename));
              			}
              			f.Close();
              		}
              		else
              		{
              
              			XmlTextWriter xmlw = new XmlTextWriter(f, System.Text.Encoding.UTF8);
              
              			xmlw.Formatting = Formatting.Indented;
              
              			xmlw.WriteStartDocument();
              			xmlw.WriteStartElement("groupe");
              			xmlw.WriteStartElement("agence");
              			xmlw.WriteAttributeString("nom", r[0]);
              			
              			xmlw.WriteStartElement("utilisateur");
              			xmlw.WriteAttributeString("fond", r[2]);
              			xmlw.WriteString(r[1]);
              			
              			xmlw.WriteEndElement();
              			xmlw.WriteEndElement();
              			xmlw.WriteEndElement();
              			
              			xmlw.WriteEndDocument();
              	
              			xmlw.Flush();
              			//vide le buffer
              
              			xmlw.Close();
              			// Close the writer
              
              			f.Close();
              		}
              
              	
              	}
              	
              	
              
              	finally {
              
              			
              	 }
              
              • Partager sur Facebook
              • Partager sur Twitter

              Parcourir et remplir un fichier XML en C#

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown