Compteur de visite dans xml

Soyez le premier à donner votre avis sur cette source.

Snippet vu 22 890 fois - Téléchargée 36 fois

Contenu du snippet

Ce code montre comment enregistrer dans un fichier XML le nombre de visite que vous avez sur une page.
Il n'y a rien d'exceptionnel, mais traite beaucoup d'XML, on a la une gestion assez complete de lire, ecrire, modifier des données contenus dans un fichier XML

Ce code fait suite à ce post http://www.aspfr.com/forum.v2.aspx?rm=1&ID=305546

Le constructeur nécessite l'objet Page de la page en cours ainsi on peut mettre ce code dans une DLL

voici un exemple d'utilisation :

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim PS As New PageStat(Page)
If Not Page.IsPostBack Then
PS.WriteStat()
End If
Response.Write("Vous etes la " & PS.ReadStat & "ème visite")
End Sub

Source / Exemple :


Imports System.IO
Imports System.Xml

''' -----------------------------------------------------------------------------
''' <summary>
''' 
''' </summary>
''' <example>Cet exemple montre comment se servir de la classe
'''  <code>
'''     Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'''        Dim PS As New PageStat(Page)
'''        If Not Page.IsPostBack then 
'''            PS.WriteStat()
'''        End If
'''        Response.Write("Vous etes la " & PS.ReadStat & "ème visite")
'''    End Sub
'''  

''' </example>
''' -----------------------------------------------------------------------------
Public Class PageStat

#Region " Variables "

'Contient le chemin du fichier xml
Private XmlPath As String
'Contient l'instance de la page
Private Page As System.Web.UI.Page

#End Region

''' -----------------------------------------------------------------------------
''' <summary>
''' Fonction creant le fichier XML conservant les données
''' </summary>
''' -----------------------------------------------------------------------------
Private Sub CreateXml()

'on verifie la presence du dossier /Data et on le cree si besoin
If Not Directory.Exists(Page.Server.MapPath("") & "\Data") Then
Dim Dir As New DirectoryInfo(Page.Server.MapPath(""))
Dir.CreateSubdirectory("Data")
End If

'on verifie la presence de Data/PageStat.xml et on le cree si besoin
If Not File.Exists(Page.Server.MapPath("Data") & "\PageStat.xml") Then

'on stocke le chemin du fichier xml
XmlPath = Page.Server.MapPath("Data/PageStat.xml")

'Creation du Fichier XML
Dim XMLobj As System.Xml.XmlTextWriter
Dim ue As New System.[Text].UnicodeEncoding
XMLobj = New System.Xml.XmlTextWriter(XmlPath, ue)

'indentation etc...
XMLobj.Formatting = System.Xml.Formatting.Indented
XMLobj.Indentation = 3
XMLobj.WriteStartDocument()

'Commentaires
XMLobj.WriteComment("XML crée pour Enregistrer le nombre de passage sur une page par Cyril Durand")
XMLobj.WriteComment("http://www.codes-sources.com/auteurdetail.aspx?ID=19303")
XMLobj.WriteComment("crée le " & Now.ToLongDateString)

'Noeud parent
XMLobj.WriteStartElement("Pages") 'Pages
XMLobj.WriteEndElement() '/Pages

'Fermeture
XMLobj.Close()
End If

End Sub

''' -----------------------------------------------------------------------------
''' <summary>
''' Instanciation de la Class PageStat
''' </summary>
''' <param name="InstanceOfPage">instance de l'objet Page de la page qui appelle la class</param>
''' -----------------------------------------------------------------------------
Public Sub New(ByVal InstanceOfPage As System.Web.UI.Page)
Page = InstanceOfPage
CreateXml()
End Sub

''' -----------------------------------------------------------------------------
''' <summary>
''' Ajoute une visite à la page en cours
''' </summary>
''' -----------------------------------------------------------------------------
Public Sub WriteStat()

'On va lire la valeur du compteur
Dim Compteur As Decimal = ReadStat()

Dim Doc As New XmlDocument
Doc.Load(XmlPath)

Select Case Compteur

'On doit créer un noeud <Page>
Case 0 Or -1

'ajout des stats de la page
Dim mElement As XmlElement
mElement = Doc.CreateElement("Page")
mElement.InnerText = 1.ToString
mElement.SetAttribute("PageName", Page.Request.CurrentExecutionFilePath)

'Fermeture du fichier
Doc.DocumentElement.AppendChild(mElement)
Doc.Save(XmlPath)

'On indente de 1 le noeud
Case Else

Dim Node As XmlNode = Doc.DocumentElement.FirstChild

'on recherche le noeud jusqu'a l'avoir trouvé puis on l'indente de 1
Do Until Node Is Nothing
If Node.Attributes(0).Value = Page.Request.CurrentExecutionFilePath Then
Node.InnerText = (Compteur + 1).ToString
Exit Do
End If
Node = Node.NextSibling
Loop

'on enregistre
Doc.Save(XmlPath)

End Select

End Sub

''' -----------------------------------------------------------------------------
''' <summary>
''' Lit le nombre de visite de la page en cours
''' </summary>
''' <returns>Le nombre de visite de la page en cours</returns>
''' -----------------------------------------------------------------------------
'''
Public Function ReadStat() As Decimal
'On appelle ReadStat avec le nom de la page en cours en paramètre
Return ReadStat(Page.Request.CurrentExecutionFilePath)
End Function

''' -----------------------------------------------------------------------------
''' <summary>
''' Lit le nombre de visite de la page Demandé
'''
''' Merci à Seb_d_angers d'avoir vu qu'il manquait quelque chose :p et d'avoir écrit cette fonction :)
''' </summary>
''' <returns>Le nombre de visite de la page Demandé</returns>
''' -----------------------------------------------------------------------------
'''
public function ReadStat(PageName as string ) as integer
dim ret as integer = 0

dim doc as new XmlDocument();
Doc.Load(sFile)
dim Node as XmlNode = Doc.DocumentElement.FirstChild
if not Node is nothing
' on recherche le noeud jusqu'a l'avoir trouvé puis on lit
do
if (Node.Attributes(0).Value == PageName)
ret = System.Convert.ToInt32(Node.InnerText)
exit do
end if
Node = Node.NextSibling
loop while (Node is nothing)
end if
return ret
end function

End Class
</code>

Conclusion :


Le code a été fait rapidement et n'a pas été testé sur du long terme, si vous trouver des erreurs, des optimisations possibles, ou alors tout autre commentaire, n'hésitez pas à me donner votre avis.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.