Bonjour à tous,
Avant d'exposer mon problème, je voudrais saluer toute la communauté de developpez.com qui me permet à chaque fois de trouver une solution à mes différents problèmes.
Je développe en ce moment une application sous Visual studio express 2010 me permettant de contrôler l’intégrité d'un fichier XML avec un schéma xsd.
Mon programme fonctionne très bien. Cependant, j'ai un léger souci sur la gestion des exceptions.
Je ne sais pas si mon problème est lié à une limitation de la class System.Xml.XmlReaderSettings ou si mon code est mal rédigé.
Je contrôle donc mon fichier xml et gère les exceptions grâce à un handler.
Ce handller me trouve bien mes erreurs que j'affiche dans un richtextbox. Je constate cependant que le code ci dessous me permet d'afficher plusieurs erreur du moment ou elle sont dans des groupes de balise différents.
Si en revanche mon fichier comporte deux erreur dans le même groupe de balises, seulement la première erreur est affiché.
Ici le code principale appelé par un tooldstripmenu
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 Private Sub XmlValidToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XmlValidToolStripMenuItem.Click Dim settings As XmlReaderSettings = New XmlReaderSettings() settings.Schemas.Add(Nothing, ".\Astm.xsd") settings.ValidationType = ValidationType.Schema Dim ItemSelected As ListView.SelectedListViewItemCollection = ListView1.SelectedItems Dim xfont As New Font(XmLvalidator.Font, 14) AddHandler settings.ValidationEventHandler, AddressOf XmlValidationError Dim taille As Single = 12 Dim reader As XmlReader = XmlReader.Create(ItemSelected(0).SubItems(0).Text, settings) Try XmLvalidator.Clear() XmlException_text.Clear() While (reader.Read()) End While Catch exml As XmlException TabControl1.SelectedIndex = 2 XmlException_text.Text += vbCrLf & "---------------------------------------------" XmlException_text.Text += vbCrLf & vbCrLf & exml.Message XmlException_text.Text += "---------------------------------------------xmlexception" & vbCrLf XmlException_text.Font = New Font("arial", taille, FontStyle.Bold) XmlException_text.ForeColor = Color.DarkRed Catch exml2 As XmlSchemaValidationException TabControl1.SelectedIndex = 2 XmlException_text.Text += vbCrLf & "---------------------------------------------" XmlException_text.Text += vbCrLf & vbCrLf & exml2.Message XmlException_text.Text += "---------------------------------------------XmlSchemaValidationException" & vbCrLf XmlException_text.Font = New Font("arial", taille, FontStyle.Bold) XmlException_text.ForeColor = Color.DarkRed Catch exml3 As XmlSchemaException TabControl1.SelectedIndex = 2 XmlException_text.Text += vbCrLf & "---------------------------------------------" XmlException_text.Text += vbCrLf & vbCrLf & exml3.Message XmlException_text.Text += "---------------------------------------------XmlSchemaException" & vbCrLf XmlException_text.Font = New Font("arial", taille, FontStyle.Bold) XmlException_text.ForeColor = Color.DarkRed End Try reader.Close() TabControl1.SelectedIndex = 2 XmLvalidator.Text = RichTextBox1.Text If XmlException_text.Text = Nothing Then XmlException_text.Text += vbCrLf & vbCrLf & "Validation OK" XmlException_text.ForeColor = Color.LimeGreen XmlException_text.Font = New Font("arial", taille, FontStyle.Bold) End If End Sub
Ici le code permettant de gérer les exceptions de schéma
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub XmlValidationError(ByVal sender As Object, ByVal e As ValidationEventArgs) Dim str As String = e.Exception.Message 'Dim str2 As String = e.Exception.LineNumber 'Dim str3 As String = e.Exception.LinePosition Dim taille As Single = 12 TabControl1.SelectedIndex = 2 XmlException_text.Text += str XmlException_text.Text += vbCrLf & vbCrLf & "---------------------------------------------XmlValidationError" & vbCrLf & vbCrLf XmlException_text.Font = New Font("arial", taille, FontStyle.Bold) XmlException_text.ForeColor = Color.DarkRed End Sub
Code xml : 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 <?xml version="1.0" encoding="ISO-8859-1"?> <Message> <header> <senderName></senderName> <version>1394-97</version> <dateTime>20140508002709</dateTime> </header> <request> <Information> <element1>B3031500059</element1> <element2>REY</element2> <element3>IRMA</element3> <element4>F</element4> </Information> <test> <spec> <specIdentifier>940508210001</specIdentifier> <testDateTime>20140508003600</testDateTime> <specType>5648</specType> </spec> </test> </request> </Message>
Pour illustrer mon problème, si j'ai deux anomalies dans le groupe <information>, sur <element1> et <element2>, mon code ne retourne que l'exception sur <element1>.
Par contre, si j'ai une anomalie sur le groupement <information> et une autre sur le groupement <spec>, mon code me retourne bien les deux erreurs.
Je n'arrive pas à comprendre ou je peux avoir faux... Comment puis je faire pour obtenir toutes les erreurs de construction de mon fichier xml en une seules fois et en toutes circonstances?
Merci pour vos lumières.
Starbuck
Partager