XML to technologia pozwalająca na przechowywanie informacji w zwykłych plikach tekstowych w usystematyzowany sposób. Technologia ta opiera się na znacznikach podobnych do tych wykorzystywanych w HTMLu.
Główną zaletą XMLa jest to, że to my sami ustalamy listę możliwych znaczników, a przez to opisujemy zawarte w pliku dane. Taki plik XMLowy może być później przetwarzany np. można taki plik przetransformować do HTMLa, a następnie udostępnić na stronie www, można także wydobyć z niego określone dane i wykorzystać je w różnoraki, zależny od naszych potrzeb sposób.
Ja zajmę się tym drugim przypadkiem. Do tego celu wykorzystam bibliotekę MSXML.DLL w wersji 2.0 dostarczającą podstawowe narzędzia pomocne przy pracy z XMLem. Ponadto przytoczony tu przykład napisany został w VB dla aplikacji, a konkretnie dla Excela - plik XMLowy wykorzystam do tworzenia statystyki odwiedzin strony.
Przykładowy plik XMLa (odwiedziny.xml) zawiera informacje o odwiedzinach strony www: data z godziną, nazwę hosta i rozdzielczość ekranu.
Żeby mieć dostęp do zawartości określonego pliku XMLa tworzymy obiekt DOMDocument:
Dim dok As DOMDocument Set dok = new DOMDocument
Teraz wskazujemy ścieżkę do naszego pliku odwiedziny.xml wykorzystując metodę Load obiektu dok:
dok.Load("C:\Projekty\XML\odwiedziny.xml")
Dokument został załadowany i możemy przejść do konkretów.
Metoda selectNodes pozwala na wybranie określonych węzłów, w wyniku otrzymujemy listę węzłów (IXMLDOMNodeList), które pasują do określonego przez nas wyrażenia. Argumentem tej metody jest wyrażenie zgodne z XPath (składnia stosowana do wskazywania położenia określonych węzłów w dokumencie XMLowym). Należy pamiętać o kontekście w jakim wywołujemy metodę selectNodes - tutaj odwołujemy się do obiektu dok, a więc do węzła głównego (root) i wyrażenie jakie wpiszemy w argumencie tej metody będzie zinterpretowane w odniesieniu do węzła głównego. Wybieramy wszystkie wpisy, żeby to zrobić wykorzystamy wyrażenie "//wpis", które "wybiera" wszystkie elementy <wpis>.
Dim wpisy As IXMLDOMNodeList Set wpisy = dok.selectNodes("//wpis")
Otrzymaliśmy tablicę węzłów numerowaną od 0 (!); każdy wiersz tej tablicy zawiera osobny węzeł - możemy teraz w prosty sposób tworząc pętle przejść przez wszystkie węzły i wykonać na nich określone operacje. My będziemy zliczali liczbę odwiedzin dla każdej godziny (przez to dowiemy się w jakich godzinach na stronie jest najwięcej gości).
Tworzymy tablicę, w której zapamiętamy liczbę odwołań dla każdej godziny (indeksem tej tablicy jest godzina):
Dim godziny(0 To 23) As Long
oraz obiekt H, który będzie odnosił się do atrybutu h (w znaczniku <wpis>)
Dim H As IXMLDOMNode
i przechodzimy do przetwarzania kolejnych wpisów:
For i = 0 To wpisy.Length - 1 ' wlasciwość Length zwraca liczbę wszystkich węzłów na liście Set H = wpisy(i).selectSingleNode("@h") ' do obiektu H zostaje przypisany pojedynczy węzeł, w tym przypadku jest to atrybut h ' wyrażenie "@h" oznacza wybranie wartości atrybutu h ' tutaj uwaga: jeżeli element ma atrybuty to są one zapisane na liście atrybutów tego elementu (numerowane od 0) ' i równie dobrze moglibyśmy tutaj użyć tą właściwość: Set H = wpisy(i).Attributes(3), h jest trzecim atrybutem tmp = Val(H.Text) ' do zmiennej tmp przypisujemy wartość liczbową atrybutu h godziny(tmp) = godziny(tmp) + 1 ' i dla odpowiedniej godziny zwiększamy licznik o 1 Next i
Ostatecznie otrzymujemy wypełnioną tablice godziny, z której w prosty sposób możemy wyprowadzić dane do arkusza Excela i np. utworzyć z nich wykres obrazujący dobowy rozkład odwiedzin na stronie.
Wpisujemy te dane do arkusza "Arkusz1" w bieżącym zeszycie:
Dim zeszyt As Worksheet Set zeszyt = Application.Worksheets("Arkusz1") For i = 0 To 23 zeszyt.Range("A" & i + 1).Text = "Godz. " & i zeszyt.Range("B" & i + 1).Value = godziny(i) Next i
Otrzymamy dwie kolumny: w jednej jest godzina (kol. A), a w drugiej liczba wizyt o tej godzinie (kol. B). Teraz już tylko kilka kliknięć myszką i wykres mamy gotowy. Przy następnym uruchamianiu tej procedury dla nowego pliku xml, kiedy wykres jest już stworzony, kolumny A i B zostaną zaktualizowane, a tym samym i wykres.
Cała nasza procedura:
Sub Licznik() Dim dok As DOMDocument Set dok = new DOMDocument dok.Load("C:\Projekty\XML\odwiedziny.xml") Dim wpisy As IXMLDOMNodeList Set wpisy = dok.selectNodes("//wpis") Dim godziny(0 To 23) As Long Dim H As IXMLDOMNode For i = 0 To wpisy.Length - 1 Set H = wpisy(i).selectSingleNode("@h") tmp = Val(H.Text) godziny(tmp) = godziny(tmp) + 1 Next i Dim zeszyt As Worksheet Set zeszyt = Application.Worksheets("Arkusz1") For i = 0 To 23 zeszyt.Range("A" & i + 1).Text = "Godz. " & i zeszyt.Range("B" & i + 1).Value = godziny(i) Next i Set dok = Nothing : Set wpisy = Nothing : Set H = nothing : Set zeszyt = Nothing End Sub
W podobny sposób możemy utworzyć statystykę pod względem rozdzielczości ekranu, nazwy hosta, liczby odwiedzin w danym miesiącu itd. Ograniczeniem jest tutaj jedynie ilość informacji jakie mamy do dyspozycji w pliku XMLowym.