Récupérer infos dans un fichier xml,j'arrive pas sur une structure à plusieur ni
cs_fcolo
Messages postés201Date d'inscriptionmercredi 8 février 2006StatutMembreDernière intervention20 février 2007
-
2 mai 2006 à 11:49
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 2007
-
3 mai 2006 à 09:57
Bonjour,
je fais appel à vous car je n'arrive pas à naviguer dans un fichier xml.
Ce fichier devrait avoir cette structure:
mais il est dans un IsoledStorage donc je ne peux pas voir vraiment à quoi il ressemble.
Je le crée ainsi:
Les variables defaultxxx sont des int, listCam un dictionnaire qui contient une structure (camera avec les membres name, url, user et pass).
private
void save ()
{
IsolatedStorageFile store = IsolatedStorageFile. GetUserStoreForAssembly
();
XmlTextWriter tw = null ;
try
{
tw = new XmlTextWriter
(new IsolatedStorageFileStream (initFileName, FileMode.Create, FileAccess.Write, store),null );
//tw.WriteComment("Fichier de sauvegarde des préférences et des configurations");
tw.WriteStartDocument ();
tw.WriteStartElement ("configuration"
);
tw.WriteStartElement ("defaultNbSecDetectInactivite"
);
tw.WriteString (defaultNbSecDetectInactivite.ToString ());
tw.WriteEndElement ();
tw.WriteStartElement ("defaultNbImgSec"
);
tw.WriteString (defaultNbImgSec.ToString ());
tw.WriteEndElement ();
tw.WriteStartElement ("defaultScruteCamTime"
);
tw.WriteString (defaultScruteCamTime.ToString ());
tw.WriteEndElement ();
tw.WriteStartElement ("nbcam"
);
tw.WriteString (listCam.Count.ToString ());
tw.WriteEndElement ();
tw.WriteStartElement ("listcam"
);
String[] liste = new String[listCam.Count
];
listCam.Keys.CopyTo (liste,0);
//copie les clés dans le tableau de String
for (int i = 0; i<listCam.Count; i
++)
{
tw. WriteStartElement
("camera"
);
camera cam = (camera)listCam[liste[i
]];
tw.WriteStartElement ("id"
);
tw.WriteString (i.ToString ());
tw.WriteEndElement ();
tw.WriteStartElement ("name"
);
tw.WriteString (cam.name
);
tw.WriteEndElement ();
tw.WriteStartElement ("url"
);
tw.WriteString (cam.url
);
tw.WriteEndElement ();
tw.WriteStartElement ("user"
);
tw.WriteString (cam.user
);
tw.WriteEndElement ();
tw.WriteStartElement ("pass"
);
tw.WriteString (cam.pass
);
tw.WriteEndElement ();
tw.WriteEndElement ();
}
tw.WriteEndElement (); //fin de listcam
tw.WriteEndElement (); //fin de configuration
tw.WriteEndDocument ();
tw.Flush ();
tw.Close ();
}
catch
{
}
finally
{
if (tw != null
)
{
tw.Close ();
}
}
}
et je le lis à partir des fonctions suivante:
private
void load ()
{
IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForAssembly ();
if ( store.GetFileNames ( initFileName ).Length != 0
)
{
this .defaultNbImgSec = Convert.ToInt32 (getConfigValue ("defaultNbImgSec",store
));
this.defaultNbSecDetectInactivite = Convert. ToInt32
(getConfigValue ("defaultNbSecDetectInactivite",store
));
this.defaultScruteCamTime = Convert.ToInt32 (getConfigValue ("defaultScruteCamTime",store
));
MessageBox.Show ("conf"+getConfigValue ("nbcam",store
));
if (Convert.ToInt32 (getConfigValue ("nbcam",store))>0
)
{
int nbcam = Convert. ToInt32
(getConfigValue ("nbcam",store
));
MessageBox.Show ("nbcam"+nbcam.ToString ());
for (int i = 1;i <= nbcam ; i
++)
{
MessageBox. Show
("cam"+i.ToString ());
camera cam = getCAm (i,store
);
if (cam.name.CompareTo ("")!= 0
)
{
listCam. Add
(cam.name,cam
);
ajoutItemContextMenu (cam.name
);
}
}
}
}
}
private
camera getCAm (int number,IsolatedStorageFile store
)
{
camera cam
;
cam.name = ""
;
cam.url = ""
;
cam.user = ""
;
cam.pass = ""
;
if
(Convert.ToInt32 (getConfigValue ("nbcam",store))>0
)
{
if (number < = Convert.ToInt32 (getConfigValue ("nbcam",store
)))
{
XmlTextReader tr = null
;
try
{
tr = new XmlTextReader (new IsolatedStorageFileStream (initFileName, FileMode.Open, FileAccess.Read, store
));
while (tr.Read ())
{
XmlNodeType NodeType = tr.NodeType
;
if
( NodeType == XmlNodeType.Element
)
{
if
(tr.Name.Equals ("listcam"
))
{
if (tr.MoveToFirstAttribute ())
{
do
{
if (tr.Name.Equals (number.ToString ()))
{
tr.MoveToFirstAttribute ();
cam.name = tr.GetAttribute ("name"
);
cam.url = tr. GetAttribute
("url"
);
cam.user = tr.GetAttribute ("user"
);
cam.pass = tr. GetAttribute
("pass"
);
return cam
;
}
}
while (tr.MoveToFirstAttribute ());
throw new Exception (string.Format ("?Caméra demandée non presente dans le fichier de configuration."
));
}
else
{
throw new Exception (string.Format ("Caméra demandée non presente dans le fichier de configuration."
));
}
}
}
}
}
catch (Exception e
)
{
cam.name = ""
;
cam.url = ""
;
cam.user = ""
;
cam.pass = ""
;
MessageBox. Show
(e.ToString ());
return cam
;
}
finally
{
if (tr ! = null )
{
tr.Close ();
}
}
}
else
{
throw new Exception (string.Format ("Numéro de caméra demandée supérieur au nombre de caméra disponible."
));
}
}
else
{
throw new Exception (string.Format ("Aucune caméra présente dans le fichier de configuration."
));
}
return cam
;
}
Il me lève mon exception lorsque j'essais de récupérer les caméras enregistrées: Exception(string.Format ("Caméra demandée non presente dans le fichier de configuration."
));
alors que, normalement, ce noeud est présent.
par contre, pour les autres paramétres, je n'ai aucun problème, juste lorsque je veux récupérer les informations d'une caméra.
Savez vous où je fais l'erreur?
Je pense que je ne sais pas descendre dans le noeud enfant (ici le numéro de ma caméra) donc qu'il ne la trouve pas.
En fait, je ne sais pas naviguer dans un fichier XML, j'ai regardé des exemple sur le forum mais je ne m'en sors pas pour mon cas. Si vous pouviez m'aider ce serait sympas.
Merci
f.colo
A voir également:
Récupérer infos dans un fichier xml,j'arrive pas sur une structure à plusieur ni
cs_kmikaz
Messages postés34Date d'inscriptionvendredi 22 mars 2002StatutMembreDernière intervention 2 mai 2006 2 mai 2006 à 18:41
Salut cher ami,
Pour descendre dans les noeuds fils d'un noeud, il faut deja tester s'il en existe puis utiliser la propriété .ChildNodes qui represente une collection xmlNode.
Exemple de lecture récusirve (le terme n'est pas forcément approprié)
XmlNodeList node = doc.GetElementsByTagName("list_cam");
if (node.Count != 0)
{
foreach(XmlNode nod1 in nod.ChildNodes)
{
switch(nod1.Name)
{
case "camera":
LoadInformationsCamera(nod1);
break;
}
}
}
Voici un exemple rapide.
Si tu ten sors fais msigne.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 3 mai 2006 à 09:57
juste une petite precision, tu peux t'epargner le premier if car si tu n'as pas de fils, le foreach sort immediatement. (je n'ai jamais vu, a ma connaissance, la propriété ChildNodes renvoyer null)