Accueil > > > PARSEUR XML
PARSEUR XML
Information sur la source
Description
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 ..
Historique
- 04 janvier 2005 20:36:14 :
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
ACCES ODBCACCES ODBC par yannickcottin
Cliquez pour lire la suite par yannickcottin
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|