CLASSE BASIQUE XML

fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007 - 28 janv. 2005 à 23:13
GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008 - 19 déc. 2006 à 19:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29158-classe-basique-xml

GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
19 déc. 2006 à 19:49
Hello,

Merci :)
Mais je te rassures, j'ai développé ce langage pour en faire quelquechose de pratique et pour combler certaines lacunes que je trouvais dans VB et d'autres langages que j'aime bien :)
Il existe depuis 2001 et va feter ses 6 ans l'annee prochaine :)

Gerome GUILLEMIN
http://www.fbsl.net
khazee Messages postés 9 Date d'inscription mardi 1 avril 2003 Statut Membre Dernière intervention 19 décembre 2006
19 déc. 2006 à 08:38
Merci pour ta réponse... Ce langage a (pour une fois) l'air utile.
J'y jetterai un oeil plus attentif dès que j'en aurai le temps.
GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
18 déc. 2006 à 20:47
Bonjour,

FBSL est un langage VB like orienté objet que je developpe depuis 2001.
Le site de FBSL se trouve ici : http://www.fbsl.net

Enjoy :)
khazee Messages postés 9 Date d'inscription mardi 1 avril 2003 Statut Membre Dernière intervention 19 décembre 2006
18 déc. 2006 à 08:32
Merci pour ta remarque et excuse moi de mon ignorance :
C'est quoi le FBSL ?

Merci
GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
18 déc. 2006 à 00:43
Pour les curieux... voici la version en FBSL :
#Option Explicit
#Apptype Console

Dim e As New SIMPLEXML
    e.NewFile( Curdir() & "\Test.xml", "myXML" )
    e.AddElement( "Version", True, False, "" )
    e.AddElement( "Version", True, False, "" )
    e.WriteValue( "Version", "HEADER", "01.001.b", 1 )
    ? e.ReadValue("Version", "HEADER")
Delete e
? "Have a look at ", Curdir() & "\Test.xml"
Pause

Class SIMPLEXML
Private:
    Begin Const
        WV_ENTRY_NOT_POSSIBLE = 2
        WV_ELEMENT_NOT_EXIST  = 1
        WV_VALUE_WRITTEN      = 0
        RV_ELEMENT_NOT_EXIST  = "0"
        DOM                   = "MSXML2.DOMDocument"
    End Const

    Type TYPE_ELEMENT
      $TE_Name       * 64
      $TE_ParentName * 64
      $TE_Valeur     * 1
    End Type

    Dim $XML_FilePath, $XML_ProjectTitle, %XML_CreateHeader, %XML_CreateBody, %NbElement
    Dim TE As TYPE_ELEMENT, TabElement[1] 'As TYPE_ELEMENT
    Shared XML_File 'As MSXML2.DOMDocument

    Method Initialize()
        If XML_File <> 0 Then ReleaseObject( XML_File )
    End Method

    Method Terminate()
        If XML_File <> 0 Then ReleaseObject( XML_File )
    End Method

    Method ReDimArray()
        ReDim Preserve TabElement[NbElement]
    End Method

Public:
    Method NewFile($FilePath, $ProjectTitle, %CreateHeader=True, %CreateBody=True)
    ' Déclaration des variables locales
    Static xFile, xHeader, xBody

        'On crée un nouveau doc
        Set XML_File = CreateObject(DOM)

        ' 
        Set xFile = GetValue( "%o", XML_File, ".createElement(%s)", ProjectTitle)
        CallMethod( XML_File, ".appendChild %o", xFile )

        'Création d'une balise Header si sélectionné (par défaut oui)
        If CreateHeader = True Then
            '<HEADER>
            Set xHeader = GetValue( "%o", XML_File, ".createElement(%s)", "HEADER")
            CallMethod( xFile, ".appendChild %o", xHeader )
            ReleaseObject( xHeader )
            'enregistrement de l'élement
            ReDimArray()
            TE.TE_Name = "HEADER"
            TE.TE_ParentName = ProjectTitle
            TabElement[NbElement] = TE
            Incr(NbElement)
        End If

        'Création d'une balise Body si sélectionné (par défaut oui)
        If CreateBody = True Then
            '
            Set xBody = GetValue( "%o", XML_File, ".createElement(%s)", "BODY" )
            CallMethod( xFile, ".appendChild %o", xBody )
            ReleaseObject( xBody )
            ' enregistrement de l'élément
            ReDimArray()
            TE.TE_Name = "BODY"
            TE.TE_ParentName = ProjectTitle
            TabElement[NbElement] = TE
            Incr(NbElement)
        End If

        ' Création du document
        PutValue( XML_File, ".documentElement = %o", xFile )

        ' On sauvegarde le fichier XML
        CallMethod( XML_File, ".save %s", FilePath )

        ' on décharge en mémoire le document
        ReleaseObject( xFile )
        ReleaseObject( XML_File )

        ' On sauvegarde, pour plus de commodité pour l'utilisateur de la classe, les paramètres
        XML_FilePath = FilePath
        XML_ProjectTitle = ProjectTitle
        XML_CreateHeader = CreateHeader
        XML_CreateBody = CreateBody
    End Method

    Method AddElement($AE_NewElementName, %AE_HeaderAppendChild, %AE_BodyAppendChild, $AE_ParentName)
        ' Déclaration des variables locales
        Static xTemp, $AppendParentName

        'On crée un nouveau doc
        Set XML_File = CreateObject(DOM)

        'Rend la lecture et écriture asynchrone
        PutValue( XML_File, ".async = %b", True )

        'Charge le fichier dans le document xml
        CallMethod( XML_File, ".Load(%s)", XML_FilePath )

        'Définition du parent
        If AE_HeaderAppendChild = True Then
            AppendParentName = "HEADER"
        ElseIf AE_BodyAppendChild = True Then
            AppendParentName = "BODY"
        Else
            AppendParentName = AE_ParentName
        End If

        ' Création de l'élément, affectation d'une valeur nulle
        Set xTemp = GetValue( "%o", XML_File, ".createElement(%s)", AE_NewElementName )
        PutValue( xTemp, ".Text = %s", "0" )
        CallMethod( XML_File, ".getElementsByTagName(%s).Item(%d).appendChild %o", AppendParentName, 0, xTemp )
        ReleaseObject( xTemp )

        ' enregistrement de l'élément
        ReDimArray()
        TE.TE_Name = AE_NewElementName
        TE.TE_ParentName = AppendParentName
        TE.TE_Valeur = "0"
        TabElement[NbElement] = TE
        Incr(NbElement)

        'Sauvegarde des données modifiées
        CallMethod( XML_File, ".save(%s)", XML_FilePath )

        ' on décharge en mémoire le document
        ReleaseObject( XML_File )
    End Method

    Method %WriteValue($WV_ElementName, $WV_ParentName, $WV_ElementValue, %WV_ElementPosition=0)
        ' Déclaration des variables locales
        Static %i, %j, %ElementId, %ElementNb, %ElementFound, $sTemp

        'On crée un nouveau doc
        Set XML_File = CreateObject(DOM)

        'Rend la lecture et écriture asynchrone
        PutValue( XML_File, ".async = %b", True )

        'Charge le fichier dans le document xml
        CallMethod( XML_File, ".Load(%s)", XML_FilePath )

        'initialisation de la recherche
        j = 0
        ElementFound = False

        ' On cherche la position de l'élément
        For i = 0 To NbElement - 1
            StrCpy(sTemp, TabElement[i].TE_Name)
            If sTemp = WV_ElementName Then
                StrCpy(sTemp, TabElement[i].TE_ParentName)
                If sTemp = WV_ParentName Then
                    If WV_ElementPosition <> 0 Then
                        If (WV_ElementPosition - 1) = j Then
                            ElementId = j
                            ElementNb = i
                            ElementFound = True
                            Exit For
                        End If
                    Else
                          ElementId = j
                          ElementNb = i
                          ElementFound = True
                          Exit For
                    End If
                End If
                Incr(j)
            End If
        Next

        'Si l'élément n'a pas été trouvé
        If ElementFound = False Then
            Return WV_ELEMENT_NOT_EXIST
        End If

        'Ecriture de la nouvelle valeur
        'On Error GoTo WriteValueFailed
        PutValue( XML_File, ".getElementsByTagName(%s).Item(%d).firstChild.Text = %s", WV_ElementName, ElementId, WV_ElementValue )

        ' enregistrement de l'élément
        TE.TE_Valeur = WV_ElementValue
        TabElement[ElementNb] = TE

        'Sauvegarde des données modifiées
        CallMethod( XML_File, ".save %s", XML_FilePath )

        ' on décharge en mémoire le document
        ReleaseObject( XML_File )

        ' On indique que tout s'est bien passé
        Return WV_VALUE_WRITTEN
    End Method

    Method $ReadValue($RV_ElementName, $RV_ParentName, %RV_ElementPosition=0)
        ' Déclaration des variables locales
        Static %i, %j, %ElementId, %ElementFound, $szValue, $sTemp

        'On crée un nouveau doc
        Set XML_File = CreateObject(DOM)

        'Rend la lecture et écriture asynchrone
        PutValue( XML_File, ".async = %b", True )

        'Charge le fichier dans le document xml
        CallMethod( XML_File, ".Load(%s)", XML_FilePath )

        'initialisation de la recherche
        j 0: ElementFound False

        ' On cherche la position de l'élément
        For i = 0 To NbElement - 1
        StrCpy(sTemp, TabElement[i].TE_Name)
        If sTemp = RV_ElementName Then
            StrCpy(sTemp, TabElement[i].TE_ParentName)
            If sTemp = RV_ParentName Then
                If RV_ElementPosition <> 0 Then
                    If RV_ElementPosition - 1 = j Then
                        ElementId = j
                        ElementFound = True
                        Exit For
                    End If
                Else
                    ElementId = j
                    ElementFound = True
                    Exit For
                End If
            End If
            Incr(j)
        End If
        Next

        'Si l'élément n'a pas été trouvé
        If ElementFound = False Then
            Return RV_ELEMENT_NOT_EXIST
        End If

        'Lecture de la valeur
        szValue = GetValue( "%s", XML_File, ".getElementsByTagName(%s).Item(%d).firstChild.Text", RV_ElementName, ElementId )

        'on décharge en mémoire le document
        ReleaseObject( XML_File )

        Return szValue
    End Method
End Class

http://www.fbsl.net
GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
18 déc. 2006 à 00:42
Merci pour la classe :)
Cependant j'ai relevé des fuites mémoires, comme notemment tout ce qui est Set xTemp = XMLFILE.xxx
Si tu ne fais pas de Set xTemp = Nothing ça fuit !!

Sinon j'ai porté ton code en FBSL, le resultat est bon :)
@++
http://www.fbsl.net
khazee Messages postés 9 Date d'inscription mardi 1 avril 2003 Statut Membre Dernière intervention 19 décembre 2006
31 janv. 2005 à 09:10
Salut fg,

alors... de rien.

Je trouve ton site plutôt pas mal. J'aimerais sincèrement que le miens soit pareil.
:-)

@+
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
28 janv. 2005 à 23:13
Merci
-------------------------
http://fg.logiciel.free.fr
Rejoignez-nous