IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Gestions caractères spéciaux avec SAX PARSER [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut Gestions caractères spéciaux avec SAX PARSER
    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,

  2. #2
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Antilles Néerlandaises

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 73
    Points : 62
    Points
    62
    Par défaut
    Bon je crois que j'ai trouvé deux solutions :

    soit j'utilise la fonction chrW() avec le code hexadecimal du caractère à remplacer, mais je dois faire une table avec tous les caractères à remplacer c'est peu pratique.
    Soit j'utilise strConv() pour convertir la chaine en unicode ce qui éviter le message d'erreur. Il faut ensuite enlevé les valeurs nulles entre chaque caractère avec un replace()

    Ci-dessous la variable Descriptif contient tout le texte qui pose problème juste avant d'écrire dans le fichier texte. C'est au niveau de l'écriture du fichier texte que vba plantait en fait.

    Replace((StrConv(Descriptif, vbUnicode)), Chr$(0), "")

    Si quelqu'un à une autre solution plus fiable je suis quand même preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Caractères spéciaux avec Dynamic Text
    Par Orb Dorb dans le forum Dynamique
    Réponses: 9
    Dernier message: 21/03/2008, 20h11
  2. Réponses: 11
    Dernier message: 18/06/2007, 15h56
  3. Réponses: 3
    Dernier message: 24/10/2006, 11h05
  4. Insert d'un champ caractères spéciaux avec firebird et php
    Par PHILOSOPHE dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 14/05/2005, 11h18
  5. traitement des caractères spéciaux avec XSLT
    Par Mirgue dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 19/07/2004, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo