Bonjour a tous!
Je développe un projet console en C#. Dans ce projet je reçois une chaîne XML d'un service REST qui récupère et insère des données dans une base de données. Les communication se font en XML. Le service REST gère le XML avec SimpleXML:
Je demande au service de m'envoyer une liste de datas que je deserialize en un objet de classe Datas. Quand je lance le projet, il y a une exception qui me dit qu'il y a une erreur dans la chaîne.
J'ai chercher un peu et j'ai trouvé.
Voici les classes:
*Classes générer avec http://xmltocsharp.azurewebsites.net/ donc pas d'erreur. J'ai juste passer Z1Pow de string a double
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 [XmlRoot(ElementName = "Data")] public class Data { [XmlElement(ElementName = "Time")] public double Time { get; set; } [XmlElement(ElementName = "Z1Pow")] public double Z1Pow { get; set; } [XmlElement(ElementName = "Z1Valid")] public string Z1Valid { get; set; } [XmlElement(ElementName = "Z1Temp")] public string Z1Temp { get; set; } [XmlElement(ElementName = "Z2Pow")] public string Z2Pow { get; set; } [XmlElement(ElementName = "Z2Valid")] public string Z2Valid { get; set; } [XmlElement(ElementName = "Z2Temp")] public string Z2Temp { get; set; } [XmlElement(ElementName = "Z3Pow")] public string Z3Pow { get; set; } [XmlElement(ElementName = "Z3Valid")] public string Z3Valid { get; set; } [XmlElement(ElementName = "Z3Temp")] public string Z3Temp { get; set; } } [XmlRoot(ElementName = "Datas")] public class Datas { [XmlElement(ElementName = "Data")] public List<Data> Data { get; set; } }
Voila un exemple de chaine XML recu:
Le problème qui se pose est au niveau de la balise <Z1Pow/>.
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 <Datas> <Data> <Time>1</Time> <Z1Pow/> <Z1Valid/> <Z1Temp>350</Z1Temp> <Z2Pow/> <Z2Valid/> <Z2Temp/> <Z3Pow/> <Z3Valid/> <Z3Temp>150</Z3Temp> </Data> <Data> <Time>1.1</Time> <Z1Pow/> <Z1Valid/> <Z1Temp>343</Z1Temp> <Z2Pow/> <Z2Valid/> <Z2Temp/> <Z3Pow/> <Z3Valid/> <Z3Temp>175</Z3Temp> </Data> </Datas>
Comme dans la classe Z1Pow est un double il veut forcément une valeur dans cette balise. Si Z1Pow est un string aucun problème.
Par exemple si il y a <Z1Pow>12.1656986</Z1Pow> ca passe (j'ai fait le test).
Comment faire pour que lorsque Z1Pow n'a pas de valeur dans la chaine XML, l'objet est une propriété qui vaut 0.00?? L'avantage de mettre l'attribut en double plutôt qu'en string est que ca m'évite d'avoir à faire 30 000 double.Parse() dans mon code.
Pour la deserialization j'utilise un un TextReader:
*chaineXML=chaine recu du service REST. this.currentDatas est de classe Datas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 using (TextReader reader = new StringReader(chaineXML)) { this.currentDatas = serializer.Deserialize(reader) as Datas; }
Merci d'avance pour votre aide
Partager