art2








VB i XML










VB i XML


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.


Tomasz Jantczak
e-mail: tomasz.jantczak@hoga.pl







Wyszukiwarka