Bonjour,

j'utilise un parser SAX XML pour parcourir un fichier volumineux.
Dans ce fichier xml j'ai trouvé à plusieurs reprise le caractère spécial suivant qui correspond à l'apostrophe :

https://www.compart.com/en/unicode/U+0092
https://fr.wikipedia.org/wiki/Table_..._Unicode/U0080

La fonction qui lance le traitement:
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
Public Function ParserCaracXml()
 
Dim saxReader As SAXXMLReader60
Dim saxhandler As Classe1
 
Set saxReader = New SAXXMLReader60
Set saxhandler = New Classe1
 
Set saxReader.contentHandler = saxhandler
'saxReader.parseURL "D:\test.xml"
saxReader.parseURL "D:\test.xml"
 
Set saxReader = Nothing
 
End Function
En cherchant à comprendre pourquoi ça plantait j'en suis venu à taper un code pas très propre :

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
'liste les balises ouvrantes
Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, strLocalName As String, strQName As String, ByVal oAttributes As MSXML2.IVBSAXAttributes)
 
Dim i As Integer
Select Case strLocalName
    Case "produit"
        produit = True
    Case "ean"
        ean = True
    Case "chapitre"
        'chapitre = True
    Case "c0"
        c0 = True
        Descriptif = oAttributes.getValueFromQName("fr")
    Case "image"
        image = True
    Case "fichiers"
        fichiers = True
    Case "fichier"
        fichier = True
        Select Case oAttributes.getValueFromQName("type")
           Case "Fiche fabriquant"
                fichier_images = False
               fiche_fabriquant = True
           Case "Image"
               fichier_images = True
                fiche_fabriquant = False
            Case "Else"
        End Select
    Case Else
        If strLocalName Like "c#" Then
            carac_suivante = True
                For i = 0 To (oAttributes.length - 1)
                    If oAttributes.getLocalName(i) = "fr" Then
                    Attribut1 = oAttributes.getValue(i)
                    'Debug.Print oAttributes.getValue(i)
                    'Debug.Print strLocalName
                    ElseIf oAttributes.getLocalName(i) = "id" Then
                    'Debug.Print oAttributes.getValue(i)
                    End If
                Next
 
            If IsNull(Attribut1) Then
            Else
                Descriptif = Descriptif & "|" & Attribut1
            End If
 
        ElseIf strLocalName Like "c##" Then
        ElseIf strLocalName Like "c###" Then
 
        End If
End Select
 
End Sub
Le code plante dès que je fait :

Descriptif = Descriptif & Attribut1

Si je tape plutôt : Descriptif = oAttributes.getValue(i)
Ou bien : Descriptif = Descriptif & "test"

le code se déroule normalement.
Si je supprime le caractère spécial PU2 directement dans le fichier xml le traitement se déroule normalement en tapant : "Descriptif = Descriptif & Attribut1"

J'aimerais comprendre pourquoi et surtout comment éviter ce genre de problème avec d'autres caractères spéciaux comme celui là.
le pire c'est le caractère spécial apparait quand je fait un debug.Print (mais il est transformé en point d'interrogation) un peu avant que le parser bloque mais j'ai le temps de passer à la balise suivante avant que ça plante

Autrement dit, quel est le moyen le plus élégant de contourner le problème de manière pérenne ?
Petite précision : mon fichier texte est créer au format unicode et le fichier xml est codé en UTF8 sans BOM.

Merci d'avance,