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:
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 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
Le code plante dès que je fait :
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
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,
Partager