Lire et écrire dans un fichier XML: Boucle infinie

Résolu
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012 - 9 févr. 2012 à 14:56
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012 - 14 févr. 2012 à 16:51
Bonjour,

Voilà quelques jours que je travaille sur la création et le remplissage d'un fichier XML en C#. Et je dois dire que là je galère un peu...

Voilà mon fichier XML:

<?xml version="1.0" encoding= "utf-8"?>
<groupe>
  
     sheira 
  
</groupe>


Et voilà le code qui me permet de créer et d'ajouter des noeuds à ce fichier XML.
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 {
 
 
 }


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 for mais rien n'y fait...(la boucle est infinie. 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... Mes "else" sont faux parce que je n'ai pas encore vérifier tous les noeuds.

Merci d'avance pour votre aide.

12 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 févr. 2012 à 14:47
Re, bien mangé ? ^^

Bon, déjà j'ai dit une bêtise, pour des HtmlControls il faut utiliser l'attribut onserverclick en lieu et place de onclick (qui est côté client). L'habitude de travailler avec des WebControls (où on utilise onclick côté server et onclientclick côté client), my bad.

Ensuite y'a pas mal de petits souci dans ton HTML, à la volée :
- les valeurs d'attributs doivent toujours être entre quote (cf. width= "5"),
- les noms des balises doivent être en minuscule (cf. < html >),
- tu ne peux pas avoir de contenu dans une balise tr sans balise td,
- width n'est pas un attribut de la balise tr,
etc ...

Voici un exemple fonctionnel (codé et testé par mes soins) qui est assez proche de ta demande, fonction d'écriture XML en moins ... et erreur HTML en moins ^^ :
<% @Page Language ="C#" Debug="true" %>
<% @Import Namespace="System" %>
<% @Import Namespace="System.Web" %>

<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=windows-1252" />
        <title>OnClick on HtmlControl inline C#</title>
        <script runat="server">
            protected void ahrefBG_Click(object sender, EventArgs e) {
                HtmlAnchor anchor = (HtmlAnchor)sender;
                h1Title.InnerText = "vous avez choisi l'image : " + anchor.Attributes["desc"];
            }
        </script>
    </head>
    
    <form id="frmMain" runat="server">
    Définir un nouveau fond d'écran
,

----

,
,
,

----

,
,


</form>

</html>
3
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
9 févr. 2012 à 22:35
Bonsoir,

si tu te crees une classe (maClasse) avec comme propiétés : Utilisateur, Fond et Prenom.
ensuite tu remplis une List<maClasse> avec toutes tes données, tu géres les doublons à la saisie.

Tu peux ensuite écrire ou lire ton xml avec LinqToXml. Voir ce post.



Whismeril
0
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012
13 févr. 2012 à 16:23
Merci whismeril.
Je suis arrivée à creer mes noeuds comme il faut toutefois j'aimerai maintenant utiliser cette fonction dans une page aspx. Mais je n'arrive pas a appeler ma fonction( ChooseBackGround) depuis ma fonction JS (setBackGround)? Comment cela se fait-il?

Merci d'avance pour votre aide.

Voici mon code:
<% @Page Language="C#" Debug="true" %>
<% @Import Namespace="System" %>
<% @Import Namespace="System.Xml" %>
<% @Import Namespace="System.IO" %>
<% @Import Namespace="System.Xml.XPath" %>
<script runat="server">
protected String chooseBG()
{
return "Hello";
}
 
protected void chooseBackGround(string[] r)
    {
try
        {
            //String[] r = { "agence3", "sheira", "fondK.jpg" };
 
 
            String filename = "test.xml";
 
            using (FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                if (f.Length != 0)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(f);
                    XmlElement racine = doc.DocumentElement;
                    //  on vérifie d'abord que la balise groupe existe 
                    if (racine !null && racine.Name "groupe")
                    {
                        XmlNodeList noeudsAgence = racine.ChildNodes;
                        if (noeudsAgence.Count > 0)
                        {
                            // on vérifie que le noeud n'existe pas avant de le créer
                            bool agenceExist = false;
                            bool utilisateurExist = false;
                            foreach (XmlNode noeudAgence in noeudsAgence)
                            {
                                if (noeudAgence.Attributes["nom"].InnerText == r[0])
                                {
                                    agenceExist = true;
                                    foreach (XmlNode utilisateur in noeudAgence.ChildNodes)
                                    {
Response.Write (utilisateur.InnerText); 
                                        if (utilisateur.InnerText == r[1])
                                        {
                                            utilisateurExist = true;
                                            utilisateur.Attributes["fond"].Value = r[2];
                                            break;
                                        }
                                    }
                                    if (!utilisateurExist)
                                    {
                                        XmlElement user = doc.CreateElement("utilisateur");
                                        user.InnerText = r[1];
                                        XmlAttribute attrFond = doc.CreateAttribute("fond");
                                        attrFond.Value = r[2];
                                        user.SetAttributeNode(attrFond);
                                        noeudAgence.AppendChild(user);
                                    }
                                }
 
                            }
 
                            if (!agenceExist)
                            {
                                XmlElement ag = doc.CreateElement("agence");
                                XmlAttribute attrNom = doc.CreateAttribute("nom");
                                attrNom.Value = r[0];
                                ag.SetAttributeNode(attrNom);
                                XmlElement user = doc.CreateElement("utilisateur");
                                user.InnerText = r[1];
                                XmlAttribute attrFond = doc.CreateAttribute("fond");
                                attrFond.Value = r[2];
                                user.SetAttributeNode(attrFond);
                                ag.AppendChild(user);
                                racine.AppendChild(ag);
                            }
                            f.Close();
                            doc.Save(HttpContext.Current.Server.MapPath(filename));
 
                        }
                    }
 
                }
                else
                {
                    XmlDocument doc = new XmlDocument();
                    XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "Utf-8", null);
                    doc.AppendChild(declaration);
                    XmlElement racine = doc.CreateElement("groupe");
                    XmlElement ag = doc.CreateElement("agence");
                    XmlAttribute attrNom = doc.CreateAttribute("nom");
                    attrNom.Value = r[0];
                    ag.SetAttributeNode(attrNom);
                    XmlElement user = doc.CreateElement("utilisateur");
                    user.InnerText = r[1];
                    XmlAttribute attrFond = doc.CreateAttribute("fond");
                    attrFond.Value = r[2];
                    user.SetAttributeNode(attrFond);
                    ag.AppendChild(user);
                    racine.AppendChild(ag);
                    doc.AppendChild(racine);
                    doc.Save(f);
                }
 
 
            }
        }
        catch (Exception ex)
        {
            //Todo:gestion des exceptions
        }
 
 
}
 
</script>
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=windows-1252" />
<script language= "Javascript" type= "text/javascript" >
 
function getVar (nomVariable)
{
var infos = location.href.substring(location.href.indexOf("?")+1, location.href.length)+"&"
if (infos.indexOf("#")!=-1)
infos = infos.substring(0,infos.indexOf("#"))+"&"
var variable=0
{
nomVariable = nomVariable + "="
var taille = nomVariable.length
if (infos.indexOf(nomVariable)!=-1)
variable = infos.substring(infos.indexOf(nomVariable)+taille,infos.length).substring(0,infos.substring(infos.indexOf(nomVariable)+taille,infos.length).indexOf("&"))
}
return variable
} 
 
function setBackGround(strFond)
{
var groupe = getVar('groupe');
var nom = getVar('nom');
var data = [];
data.push(groupe, nom);
data.push(strFond);
//alert (data.join(","));
 
alert("<%= chooseBG() %>;
 
<% 
String[] r = { "agence4", "Olivier", "fondO.jpg" };
/*String agence = Request.Params["groupe"];*/
String prenom = Request.Params["nom"];
 
chooseBackGround(r);
%>
 
 
}
 
 
</script>
 
<script language= "C#" type= "text/C#" runat= "Server">
private void chooseBackgroud()
{
}
 
</script>
 
</HEAD>

Définir un nouveau fond d'écran

----

, 1.1
,
,
,

----

----

----

,
,
,


 

</HTML>
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
13 févr. 2012 à 16:43
Salut,

comme tu l'as justement écrit, tes fonctions C# sont runat server. Tu ne peux donc pas les appeler directement en JS (qui lui est côté client). Soit tu submit vers le serveur pour qu'il te fasse les modifs souhaitées, soit tu utilises une XmlHttpRequest (AJAX).

Bon dev
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012
13 févr. 2012 à 17:24
Merci Jopop!

Question bête peut-être mais je la pause quand même ma fonction ne peut pas être runat client?

Comment gérer le submit de la balis' , à travers le onclick? Serait-il possible de faire un

                
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 févr. 2012 à 08:37
Re,

la question n'est pas bête, mais comme tu te doutes ce n'est pas possible (à moins de passer en mode ActiveX, version Microsoft d'une Applet, mais je te le déconseille : demande des droits de la part de l'utilisateur).

Si tu lies ton A HREF à une fonction tu feras un aller/retour sur le serveur, donc rechargement de la page. J'ai pas trop l'habitude de travailler avec le code inline, je vais donc te faire de simples indications, tu te tentes et tu reviens ici si tu coinces :

- il te faut déjà encapsuler tes balises dans un tag form :
<form runat="server">
   <!-- tes balises de saisie et de validation -->
</form>


- il faut ensuite identifier et déclarer ta balise A HREF aussi côté serveur :
Click voir si tu oses


- enfin, ta fonction côté serveur doit respecter cette forme :
protected void ahrefChoose_Click(object sender, EventArgs e) {
   // ce que tu souhaites faire
}


Normalement le .NET doit se charger de faire le lien entre le côté client et le côté serveur grâce à des JS et des balises hidden. Mais encore une fois j'ai jamais codé tout inline, à voir.

Bon courage
0
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012
14 févr. 2012 à 10:57
Merci pour ton aide et tes explications Jopop.

J'ai essayé ce que tu m'a dit mais ça ne fonctionne pas.

1) Je ne sais pas quoi mettre comme dans le href de ma balise: je veux juste qu'il fasse ce que je lui demande de faire dans ma fonction C#

2) Voici le code que je teste, peut-être pourra tu voir un peu plus clair. Je veux juste qu'au clique sur mon image, il m’exécute ma fonction. Mais je dois dire que là ça me dépasse un peu.

<% @Page Language="C#" Debug="true" %>
<% @Import Namespace="System" %>
<% @Import Namespace="System.Web" %>
<% @Import Namespace="System.Xml" %>
<% @Import Namespace="System.IO" %>
<% @Import Namespace="System.Xml.XPath" %>
<script runat="server">
public String chooseBG()
{
return "Hello";
}

protected void ahrefChooseBackGround_Click(String fond)
    {
try
        {
            //String[] r = { "agence3", "sheira", "fondK.jpg" };
String agence = HttpContext.Current.Request.Params["groupe"];
String prenom = HttpContext.Current.Request.Params["nom"];
String[] r = new String []{ agence, prenom, fond};

            String filename = "test.xml";
            using (FileStream f = new FileStream(HttpContext.Current.Server.MapPath(filename), FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                if (f.Length != 0)
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(f);
                    XmlElement racine = doc.DocumentElement;
                    //  on vérifie d'abord que la balise groupe existe 
                    if (racine !null && racine.Name "groupe")
                    {
                        XmlNodeList noeudsAgence = racine.ChildNodes;
                        if (noeudsAgence.Count > 0)
                        {
                            // on vérifie que le noeud n'existe pas avant de le créer
bool agenceExist = false;
                            bool utilisateurExist = false;
                            foreach (XmlNode noeudAgence in noeudsAgence)
                            {
                                if (noeudAgence.Attributes["nom"].InnerText == r[0])
                                {
                                    agenceExist = true;
                                    foreach (XmlNode utilisateur in noeudAgence.ChildNodes)
                                    {
Response.Write (utilisateur.InnerText); 
                                        if (utilisateur.InnerText == r[1])
                                        {
                                            utilisateurExist = true;
                                            utilisateur.Attributes["fond"].Value = r[2];
                                            break;
                                        }
                                    }
                                    if (!utilisateurExist)
                                    {
                                        XmlElement user = doc.CreateElement("utilisateur");
                                        user.InnerText = r[1];
                                        XmlAttribute attrFond = doc.CreateAttribute("fond");
                                        attrFond.Value = r[2];
                                        user.SetAttributeNode(attrFond);
                                        noeudAgence.AppendChild(user);
                                    }
                                }
 
                            }
 
                            if (!agenceExist)
                            {
                                XmlElement ag = doc.CreateElement("agence");
                                XmlAttribute attrNom = doc.CreateAttribute("nom");
                                attrNom.Value = r[0];
                                ag.SetAttributeNode(attrNom);
                                XmlElement user = doc.CreateElement("utilisateur");
                                user.InnerText = r[1];
                                XmlAttribute attrFond = doc.CreateAttribute("fond");
                                attrFond.Value = r[2];
                                user.SetAttributeNode(attrFond);
                                ag.AppendChild(user);
                                racine.AppendChild(ag);
                            }
                            f.Close();
                            doc.Save(HttpContext.Current.Server.MapPath(filename));
                         }
                    }
                }
                else
                {
                    XmlDocument doc = new XmlDocument();
                    XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "Utf-8", null);
                    doc.AppendChild(declaration);
                    XmlElement racine = doc.CreateElement("groupe");
                    XmlElement ag = doc.CreateElement("agence");
                    XmlAttribute attrNom = doc.CreateAttribute("nom");
                    attrNom.Value = r[0];
                    ag.SetAttributeNode(attrNom);
                    XmlElement user = doc.CreateElement("utilisateur");
                    user.InnerText = r[1];
                    XmlAttribute attrFond = doc.CreateAttribute("fond");
                    attrFond.Value = r[2];
                    user.SetAttributeNode(attrFond);
                    ag.AppendChild(user);
                    racine.AppendChild(ag);
                    doc.AppendChild(racine);
                    doc.Save(f);
                }
            }
        }
        catch (Exception ex)
        {
            //Todo:gestion des exceptions
        }
}

</script>
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=windows-1252" />
<script language= "Javascript" type= "text/javascript" >

function getVar (nomVariable)
{
var infos = location.href.substring(location.href.indexOf("?")+1, location.href.length)+"&"
if (infos.indexOf("#")!=-1)
infos = infos.substring(0,infos.indexOf("#"))+"&"
var variable=0
{
nomVariable = nomVariable + "="
var taille = nomVariable.length
if (infos.indexOf(nomVariable)!=-1)
variable = infos.substring(infos.indexOf(nomVariable)+taille,infos.length).substring(0,infos.substring(infos.indexOf(nomVariable)+taille,infos.length).indexOf("&"))
}
return variable
} 

function setBackGround(strFond)
{
var groupe = getVar('groupe');
var nom = getVar('nom');
var data = [];
data.push(groupe, nom);
data.push(strFond);
//alert (data.join(","));

//alert("<%= chooseBG() %>;

<% 
String[] r = { "agence4", "Olivier", "fondO.jpg" };
/*String agence = HttpContext.Current.Request.Params["groupe"];*/
String prenom = HttpContext.Current.Request.Params["nom"];
Response.Write(prenom);
//chooseBackGround(r);
%>
}
</script>
</HEAD>

<form runat="server">
Définir un nouveau fond d'écran

----

,
,
,
,

----

----

----

,
,
,


</form>

</HTML>

   
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 févr. 2012 à 11:53
Re vite fait,

je vais pas tarder à aller manger, donc juste une petite chose avant de regarder ton code de plus près : tes fonctions dans tes A HREF sont des références, elles ne prennent pas de paramètre ni même de parenthèses :
<!-- il faut écrire comac -->
Click voir si tu oses
<!-- et pas comac -->
Click voir si tu oses

D'ailleurs si tu as lu le proto d'un EventHandler que j'ai donné plus haut tu vois que cette fonction prend 2 paramètres : l'objet qui appelle la fonction et un ensemble d'arguments structurés dans un EventArgs, rien à voir avec un string ;)

A+
0
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012
14 févr. 2012 à 12:10
J'ai modifié les paramètres de ma procédure comme tu me l'as précisé
et modifier mes a href, j'ai même créer un bouton pour voir si ça ne fonctionnerai pas mieux, mais rien n'y fait.

<td  width=5  height =5></td>


Encore merci pour ton aide, bonne appétit. A+
0
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012
14 févr. 2012 à 14:24
J'ai un peu avancer:

en faisant ça, ça fonctionnne
<tr width=25>
<td  width=5  height =5>



</td>
<td  width=5  height =5>



</td>
<td  width=5  height =5>



</td>
<td  width=5  height =5>



</td>
</tr>


Par contre est-ce qu'il y a un moyen que je récupère la valeur de
ImageUrl= "../images/fond1.jpg"
dans ma fonction ahrefChooseBackGround_Click, j'en ai besoin pour connaître le nom de l'image ??

Merci pour votre aide.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
14 févr. 2012 à 14:50
Oui, plutôt que d'utiliser un A HREF avec l'attribut onserverclick tu peux effectivement utiliser la version WebControl, et donc l'attribut onclick.

Pour ce qui est de récupérer une donnée spécifique de là où l'utilisateur click je t'ai mis ça dans mon code plus haut : Tu cast le sender dans son type d'origine et tu récupères ce que tu souhaites. J'ai poussé le vice encore plus loin en créant carrément un nouvel attribut que j'ai appelé desc.

Bon finalisation
0
sheira31 Messages postés 7 Date d'inscription jeudi 9 février 2012 Statut Membre Dernière intervention 14 février 2012
14 févr. 2012 à 16:51
Merci beaucoup Jopop ça fonctionne!
0
Rejoignez-nous