Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PARSEUR XML


Information sur la source

Catégorie :Base de Donnees Niveau : Débutant Date de création : 04/01/2005 Date de mise à jour : 04/01/2005 20:36:14 Vu / téléchargé: 5 522 / 616

Note :
Aucune note

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Le titre est assez explicie je pense ^^. Bon, vous avez un prog capable de parser du xml ( a remodifier, ce prog ancien est sous vb1.0), de modifier des balises, et de sauvegarder un fichier xml
###
pour l'exe, allez a http://magus54.free.fr/prog
###
Aah , j'oubliais ! il y a une petite fonction de machin shareware avec un truc a serial pour vous amuser. Le keygen est inclu dans le zip.
 

Source

  • 'Code source du parseur:
  • Sub Load_Xmlfile (fichier As String)
  • On Error GoTo ERREUR
  • XML_Max = 0: History_max = 0
  • erreur_type = 2
  • Set_Progressbar_to 0
  • max = Count_File_Lines(fichier): T = 0
  • filestr$ = ""
  • xf = Open_DosFile(fichier, "input")
  • Do While Not EOF(xf)
  • T = T + 1: p = 100 * T / max
  • Set_Progressbar_to p
  • Line Input #xf, txt$
  • text$ = RTrim$(LTrim$(txt$))
  • filestr$ = filestr$ + text$
  • x = DoEvents()
  • Loop
  • Close #xf
  • clipboard.SetText filestr$
  • filestr$ = "<@>" + filestr$ + "</@>"
  • '/////////////////////////////////////////////////////
  • XML_Parent(0) = 0
  • XML_NOM(0) = "@"
  • XML_Value(0) = ""
  • XML_Max = 1
  • ReDim A_Traiter(2000) As String
  • ReDim A_Traiter_id(2000) As Integer
  • ReDim A_Traiter_xmin(2000) As Integer
  • ReDim A_Traiter_xmax(2000) As Integer
  • A_Traiter_max = 1
  • A_Traiter(0) = "@"
  • A_Traiter_id(0) = 0
  • A_Traiter_xmin(0) = 1
  • A_Traiter_xmax(0) = Len(filestr$)
  • erreur_type = 1
  • Do While A_Traiter_max
  • 'Debug.Print "Traitement de " + A_Traiter(A_Traiter_max - 1)
  • xmin = A_Traiter_xmin(A_Traiter_max - 1)
  • xmax = A_Traiter_xmax(A_Traiter_max - 1)
  • substr$ = Mid$(filestr$, xmin, xmax - xmin + 1)
  • 'Debug.Print substr$
  • Traitn$ = A_Traiter(A_Traiter_max - 1)
  • Trait = A_Traiter_id(A_Traiter_max - 1)
  • li = Len(substr$): l = li
  • Debut = xmin
  • substr$ = Mid$(substr$, Len("<" + Traitn$ + ">") + 1)
  • substr$ = Left$(substr$, Len(substr$) - Len("</" + Traitn$ + ">"))
  • 'Debug.Print "=>" + substr$
  • inBalise = 0
  • A_Traiter_max = A_Traiter_max - 1
  • Started = 0
  • pt = 0
  • Do: pt = pt + 1
  • x = DoEvents()
  • If Len(substr$) = 0 Then Exit Do
  • p = 100 * pt / Len(substr$)
  • Set_Progressbar_to p
  • next_balise = InStr(pt, substr$, "<")
  • pt = next_balise: If pt = 0 Then Exit Do
  • aflag = InStr(pt, substr$, "/>")
  • renext_balise = InStr(pt + 1, substr$, "<")
  • next_Anbalise = InStr(pt, substr$, "</")
  • flag = 0
  • If aflag > 0 And aflag < renext_balise Then
  • flag = 1
  • Else
  • If next_balise = next_Anbalise Then inBalise = inBalise - 1 Else inBalise = inBalise + 1
  • End If
  • If inBalise = 1 And next_balise <> next_Anbalise Then
  • next_finbalise = InStr(pt, substr$, ">")
  • nom_balise$ = Mid$(substr$, next_balise + 1, next_finbalise - next_balise - 1)
  • If flag = 0 And Right$(nom_balise$, 1) <> "/" Then
  • onom_balise$ = Mid$(substr$, next_balise + 1, next_finbalise - next_balise - 1)
  • 'Debug.Print
  • 'Debug.Print "Ajout de la propriété " + nom_balise$ + " de " + Traitn$
  • XML_Parent(XML_Max) = Trait
  • XML_FILS(Trait) = XML_FILS(Trait) + Str$(XML_Max)
  • XML_NOM(XML_Max) = nom_balise$
  • next_oBalise = InStr(pt + 1, substr$, "<")
  • valu$ = Mid$(substr$, next_finbalise + 1, next_oBalise - next_finbalise - 1)
  • 'Debug.Print "value=" + valu$
  • XML_Value(XML_Max) = valu$
  • A_Traiter_xmin(A_Traiter_max) = pt + Debut + Len("<" + Traitn$ + ">") - 1'+2
  • pt1 = A_Traiter_xmin(A_Traiter_max)
  • Started = 1
  • ElseIf flag = 1 And Right$(nom_balise$, 1) = "/" Then
  • trag$ = Left$(nom_balise$, Len(nom_balise$) - 1)
  • XML_TAGS(XML_Max) = XML_TAGS(XML_Max) + trag$
  • 'Debug.Print "Ajout du tag " + trag$ + " à la propriété " + Traitn$
  • nom_balise$ = onom_balise$
  • End If
  • ElseIf flag = 0 And inBalise = 0 And Started = 1 Then
  • 'Debug.Print pt
  • 'Debug.Print "Validation de la propriété " + nom_balise$ + " de " + Traitn$
  • A_Traiter(A_Traiter_max) = nom_balise$
  • A_Traiter_id(A_Traiter_max) = XML_Max
  • A_Traiter_xmax(A_Traiter_max) = Debut + Len("<" + Traitn$ + ">") - 2 + pt + Len("</" + nom_balise$ + ">")
  • XML_Max = XML_Max + 1
  • A_Traiter_max = A_Traiter_max + 1
  • Else
  • End If
  • Loop While pt >= 0 And pt <= Len(substr$) And InStr(pt, substr$, "<") > 0
  • Loop
  • Set_Progressbar_to 110
  • History_go 0
  • Exit Sub
  • ERREUR: If Err <> 0 Then tt = Err: Resume ERREUR
  • On Error GoTo 0
  • endl$ = Chr$(13) + Chr$(10)
  • message$ = "Une erreur de type" + Str$(erreur_type * 1000 + tt) + " (" + Error$(tt) + ") s'est produite." + endl$
  • message$ = message$ + "-----------" + endl$
  • Select Case erreur_type * 1000 + tt
  • Case 1014: message$ = message$ + "Ceci arrive fréquemment au traitement d'une balise trop volumineuse" + endl$
  • Case 1005: message$ = message$ + "Ceci arrive fréquemment au traitement d'un fichier XML foireux ou d'un fichier non-XML." + endl$
  • Case 1009: message$ = message$ + "Cette erreur à lieu quand on charge trop de balises (max:2000)" + endl$
  • Case Is > 2000: message$ = message$ + "Le fichier ne peut être chanrgé en mémoire" + endl$
  • Case Else: message$ = message$ + "Désolé, on ne peut pas vous en dire plus" + endl$
  • End Select: Reset
  • message$ = message$ + "Fichier ouvert: " + fichier$ + endl$
  • If A_Traiter_max <= 0 Then A_Traiter_max = 1
  • message$ = message$ + "Balise en cours de traitement:" + A_Traiter(A_Traiter_max - 1) + endl$
  • die message$
  • End Sub
'Code source du parseur:
Sub Load_Xmlfile (fichier As String)
On Error GoTo ERREUR
XML_Max = 0: History_max = 0
erreur_type = 2

Set_Progressbar_to 0
max = Count_File_Lines(fichier): T = 0
filestr$ = ""
xf = Open_DosFile(fichier, "input")
 Do While Not EOF(xf)
   T = T + 1: p = 100 * T / max
   Set_Progressbar_to p
   Line Input #xf, txt$
   text$ = RTrim$(LTrim$(txt$))
   filestr$ = filestr$ + text$
   x = DoEvents()
  Loop
Close #xf
clipboard.SetText filestr$
filestr$ = "<@>" + filestr$ + "</@>"
'/////////////////////////////////////////////////////
XML_Parent(0) = 0
XML_NOM(0) = "@"
XML_Value(0) = ""
XML_Max = 1

ReDim A_Traiter(2000) As String
ReDim A_Traiter_id(2000) As Integer
ReDim A_Traiter_xmin(2000) As Integer
ReDim A_Traiter_xmax(2000) As Integer
A_Traiter_max = 1
A_Traiter(0) = "@"
A_Traiter_id(0) = 0
A_Traiter_xmin(0) = 1
A_Traiter_xmax(0) = Len(filestr$)
erreur_type = 1

Do While A_Traiter_max
 'Debug.Print "Traitement de " + A_Traiter(A_Traiter_max - 1)
   xmin = A_Traiter_xmin(A_Traiter_max - 1)
   xmax = A_Traiter_xmax(A_Traiter_max - 1)
   substr$ = Mid$(filestr$, xmin, xmax - xmin + 1)
 'Debug.Print substr$
   Traitn$ = A_Traiter(A_Traiter_max - 1)
   Trait = A_Traiter_id(A_Traiter_max - 1)
   li = Len(substr$): l = li
   Debut = xmin
   substr$ = Mid$(substr$, Len("<" + Traitn$ + ">") + 1)
   substr$ = Left$(substr$, Len(substr$) - Len("</" + Traitn$ + ">"))
 'Debug.Print "=>" + substr$
   inBalise = 0
    A_Traiter_max = A_Traiter_max - 1
    Started = 0
   pt = 0
   Do: pt = pt + 1
      x = DoEvents()
      If Len(substr$) = 0 Then Exit Do
      p = 100 * pt / Len(substr$)
      Set_Progressbar_to p
      next_balise = InStr(pt, substr$, "<")
      pt = next_balise: If pt = 0 Then Exit Do
      aflag = InStr(pt, substr$, "/>")
      renext_balise = InStr(pt + 1, substr$, "<")
      next_Anbalise = InStr(pt, substr$, "</")
      flag = 0
      If aflag > 0 And aflag < renext_balise Then
       flag = 1
      Else
      If next_balise = next_Anbalise Then inBalise = inBalise - 1 Else inBalise = inBalise + 1
      End If
      If inBalise = 1 And next_balise <> next_Anbalise Then
          
          next_finbalise = InStr(pt, substr$, ">")
          nom_balise$ = Mid$(substr$, next_balise + 1, next_finbalise - next_balise - 1)
          If flag = 0 And Right$(nom_balise$, 1) <> "/" Then
          onom_balise$ = Mid$(substr$, next_balise + 1, next_finbalise - next_balise - 1)
            
 'Debug.Print
 'Debug.Print "Ajout de la propriété " + nom_balise$ + " de " + Traitn$
             XML_Parent(XML_Max) = Trait
             XML_FILS(Trait) = XML_FILS(Trait) + Str$(XML_Max)
             XML_NOM(XML_Max) = nom_balise$
             next_oBalise = InStr(pt + 1, substr$, "<")
             valu$ = Mid$(substr$, next_finbalise + 1, next_oBalise - next_finbalise - 1)
 'Debug.Print "value=" + valu$
             XML_Value(XML_Max) = valu$
             A_Traiter_xmin(A_Traiter_max) = pt + Debut + Len("<" + Traitn$ + ">") - 1'+2
             pt1 = A_Traiter_xmin(A_Traiter_max)
             Started = 1
         ElseIf flag = 1 And Right$(nom_balise$, 1) = "/" Then
            
            trag$ = Left$(nom_balise$, Len(nom_balise$) - 1)
            XML_TAGS(XML_Max) = XML_TAGS(XML_Max) + trag$
 'Debug.Print "Ajout du tag " + trag$ + " à la propriété " + Traitn$
            nom_balise$ = onom_balise$
         End If
      ElseIf flag = 0 And inBalise = 0 And Started = 1 Then
          'Debug.Print pt
 'Debug.Print "Validation de la propriété " + nom_balise$ + " de " + Traitn$
          A_Traiter(A_Traiter_max) = nom_balise$
          A_Traiter_id(A_Traiter_max) = XML_Max
          A_Traiter_xmax(A_Traiter_max) = Debut + Len("<" + Traitn$ + ">") - 2 + pt + Len("</" + nom_balise$ + ">")
          XML_Max = XML_Max + 1
          A_Traiter_max = A_Traiter_max + 1
      Else
      End If
   Loop While pt >= 0 And pt <= Len(substr$) And InStr(pt, substr$, "<") > 0
Loop
      Set_Progressbar_to 110
      History_go 0
Exit Sub
ERREUR: If Err <> 0 Then tt = Err: Resume ERREUR
On Error GoTo 0
endl$ = Chr$(13) + Chr$(10)
message$ = "Une erreur de type" + Str$(erreur_type * 1000 + tt) + " (" + Error$(tt) + ") s'est produite." + endl$
message$ = message$ + "-----------" + endl$
Select Case erreur_type * 1000 + tt
Case 1014: message$ = message$ + "Ceci arrive fréquemment au traitement d'une balise trop volumineuse" + endl$
Case 1005: message$ = message$ + "Ceci arrive fréquemment au traitement d'un fichier XML foireux ou d'un fichier non-XML." + endl$
Case 1009: message$ = message$ + "Cette erreur à lieu quand on charge trop de balises (max:2000)" + endl$
Case Is > 2000: message$ = message$ + "Le fichier ne peut être chanrgé en mémoire" + endl$
Case Else: message$ = message$ + "Désolé, on ne peut pas vous en dire plus" + endl$
End Select: Reset
           message$ = message$ + "Fichier ouvert: " + fichier$ + endl$
           If A_Traiter_max <= 0 Then A_Traiter_max = 1
           message$ = message$ + "Balise en cours de traitement:" + A_Traiter(A_Traiter_max - 1) + endl$
           

die message$
End Sub

Conclusion

Attention ! mon programme ne marche UNIQUEMENT avec des balises composées d'un seul mot ( pr exemple, <balise> marche alors que <xml version=3.2> fait planter le prog) mais bon c'est vite réglé si vous vous intéressez au xml ..
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

04 janvier 2005 20:36:14 :

Commentaires et avis

signaler à un administrateur
Commentaire de fg85 le 04/01/2005 22:32:52

Chapeau mon gars c rare de voir des sources d'un telle niveau (je parle de tes 2 sources ...)

-------------------------
http://fg.logiciel.free.fr

signaler à un administrateur
Commentaire de taousomar le 06/01/2005 17:45:51

bonjour, je tiens à vous remercier; je m'excuse par ce que je vais poser une question dans un commentaire  .
est ce que je veux avoir un code que me permet d'utiliser un fichier XML au niveau local ( dans mon poste)  
merci

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.