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