Récupérer infos dans un fichier xml,j'arrive pas sur une structure à plusieur ni

Signaler
Messages postés
201
Date d'inscription
mercredi 8 février 2006
Statut
Membre
Dernière intervention
20 février 2007
-
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
-
Bonjour,

je fais appel à vous car je n'arrive pas à naviguer dans un fichier xml.
Ce fichier devrait avoir cette structure:

<configuration>
<defaultNbSecDetectInactivite>5
</defaultNbSecDetectInactivite>
<defaultNbImgSec>9
</defaultNbImgSec>
<defaultScruteCamTime>0
</defaultScruteCamTime>
<nbcam>2
</nbcam>
<listcam>
<camera>
1

<nom>cam1
</nom>
url1

user1

pass1

</camera>
<camera>
2

<nom>cam2
</nom>
url2

user2

pass2

</camera>
</listcam>
</configuration>

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
String getConfigValue
(String param,IsolatedStorageFile 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
(param
))
{
return tr.ReadString
();
}
}
}
}
catch
(Exception e
)
{
MessageBox.Show
(e.ToString
());
return ""
;
}
finally

{
if
(tr ! = null
)
{
tr.Close
();
}
}
return ""
;
}

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

2 réponses

Messages postés
34
Date d'inscription
vendredi 22 mars 2002
Statut
Membre
Dernière intervention
2 mai 2006

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.
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
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)