FichierXML.bas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. Attribute VB_GlobalNameSpace = False
  2. Attribute VB_Creatable = False
  3. Attribute VB_PredeclaredId = False
  4. Attribute VB_Exposed = False
  5. Option Compare Database
  6. Option Explicit
  7. '******
  8. ' Créer et éditer un ficher XML complexe
  9. ' v 1
  10. '******
  11. Private cheminXML As String 'nom du fichier à créer
  12. Private oXML As MSXML2.DOMDocument60 'ref au fichier xml
  13. Private oNode As MSXML2.IXMLDOMNode 'noeud principal du document
  14. Private n(99) As MSXML2.IXMLDOMNode 'arborescence des noeuds
  15. Private position As Integer 'position dans l'arborescence
  16. Private S As Boolean 'activer la sauvegarde progressive? (deboguage)
  17. Private Sub exempleCreationXML()
  18. 'exemple d'utilisation de cette classe
  19. Dim xml As New FichierXML
  20. xml.creer ("c:\essai.xml")
  21. xml.ouvrirNoeud "a"
  22. xml.ajout "a1", "essai"
  23. xml.ouvrirNoeud "b"
  24. xml.ajout "b1", 123
  25. xml.ajout "b2", #1/1/2015#
  26. xml.fermerNoeud "b"
  27. xml.ajout "a2", "essai2"
  28. xml.enregistrer
  29. End Sub
  30. Public Sub creer(chemin As String, Optional nomNoeudPrincipal As String = "", Optional svgConstante As Boolean = False)
  31. If initialiser(nomNoeudPrincipal, svgConstante) = False Then GoTo fin
  32. If majCheminXML(chemin) = False Then GoTo fin
  33. If S = True Then Call enregistrer
  34. fin:
  35. End Sub
  36. Public Sub enregistrer(Optional chemin As String = "", Optional ecraser As Boolean = True)
  37. On err GoTo err
  38. If Len(chemin) > 0 Then
  39. If majCheminXML(chemin) = False Then GoTo fin
  40. End If
  41. oXML.Save cheminXML
  42. fin:
  43. Exit Sub
  44. err:
  45. MsgBox "Erreur (sauvegarde du fichier XML): " & err.Description
  46. GoTo fin
  47. End Sub
  48. Private Sub class_Initialize()
  49. 'Call initialiser
  50. End Sub
  51. Private Function initialiser(ByVal nomNoeudPrincipal As String, ByVal svgConstante As Boolean) As Boolean
  52. initialiser = False
  53. S = svgConstante
  54. Set oXML = New MSXML2.DOMDocument60
  55. Set oNode = oXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""")
  56. oXML.appendChild oNode
  57. Set n(0) = oXML
  58. position = 0
  59. If Len(nomNoeudPrincipal) = 0 Then nomNoeudPrincipal = "Fichier"
  60. Call ouvrirNoeud(nomNoeudPrincipal)
  61. initialiser = True
  62. End Function
  63. Private Sub class_Terminate()
  64. On Error GoTo fin
  65. Dim noeud As Variant
  66. For Each noeud In n
  67. Set noeud = Nothing
  68. Next noeud
  69. Set oNode = Nothing
  70. Set oXML = Nothing
  71. fin:
  72. End Sub
  73. Private Function majCheminXML(chemin As String) As Boolean
  74. On Error GoTo err
  75. majCheminXML = False
  76. If Dir(repFichier(chemin), vbDirectory) = "" Then GoTo errRepCible
  77. If Right(chemin, 4) <> ".xml" Then chemin = chemin & ".xml"
  78. cheminXML = chemin
  79. majCheminXML = True
  80. fin:
  81. Exit Function
  82. err:
  83. MsgBox "Erreur: " & err.Description
  84. GoTo fin
  85. errRepCible:
  86. MsgBox "Erreur: le répertoire cible n'existe pas, veuillez le créer ou prévenir un administrateur"
  87. GoTo fin
  88. End Function
  89. Public Sub ouvrirNoeud(nom As String)
  90. 'ouvre un nouveau noeud
  91. Set n(position + 1) = n(position).appendChild(oXML.createElement(nom))
  92. position = position + 1
  93. End Sub
  94. Public Sub fermerNoeud(Optional nom As String)
  95. 'ferme le noeud (nom à titre indicatif)
  96. If position > 0 Then position = position - 1
  97. fin:
  98. End Sub
  99. Public Sub ajout(ByVal nom As String, ByVal valeur As Variant, Optional attribut As String = "", Optional valAttribut As Variant = "")
  100. 'ajoute un noeud texte (avec son attribut si nécessaire)
  101. Dim elt As MSXML2.IXMLDOMElement 'noeud 'element'
  102. Dim oAttribut As IXMLDOMAttribute
  103. Set elt = n(position).appendChild(oXML.createElement(nom))
  104. elt.Text = CStr(Nz(valeur, ""))
  105. If Len(attribut) > 0 Then
  106. Set oAttribut = oXML.createAttribute(CStr(Nz(attribut, "")))
  107. oAttribut.Text = valAttribut
  108. elt.setAttributeNode oAttribut
  109. End If
  110. End Sub