Download eksempel |
|
Simpelt brug af XML under Visual Basic At gemme data i sine applikationer er et kapitel for sig selv. Skal man opfinde sine egne datastrukturer eller skal man bruge en tung database? Valget er selvfølgelig dit egent, men hvis du vælger den første løsning, skal du både programmere skrive og læse funktioner, parser og editor som kan vedligeholde dine data. Her kommer XML ind i billedet.XML står for eXtensible Markup Language og er som mange tror IKKE en udvidet version af HTML. Derimod er det en standard som tilbyder at opbevare information på en selv-defineret struktureret form. Grunden til misforståelsen med HTML er, at man meget nemt kan opbygge en hel hjemmeside i XML, med hjælp fra et stylesheet (XSL). Men i denne artikel vil jeg holde mig til at vise muligheden for at bruge XML i VB. XML bygges op i ren tekst og lige netop det gør det til et meget kompatibelt format. Selve opbygningen af en XML fil foregår ved hjælp af tags, ligesom vi kender det fra HTML. Men forskellen er, at her definere vi selv tagsene. XML er også selvforklarende, som betyder at hvis man åbner en ukendt XML fil, skulle man meget gerne hurtigt kunne gennemskue meningen med indholdet af filen. Dette er f.eks pga. de sigende tags som man ‘selvfølgelig’ laver. Her vil jeg vise hvordan man opbyggeren XML fil.
<KARTOTEK>
<PERSON>
<NAVN>Peer Larsen</NAVN>
<MEDLNR>1</MEDLNR>
</PERSON>
<PERSON>
<NAVN>Anders Hansen</NAVN>
<MEDLNR>517</MEDLNR>
</PERSON>
</KARTOTEK>
Som man kan se er dataene opbygget hierarkisk og ikke relationelt som i f.eks en Access database, på den måde kan man hurtigt finde frem til det data som man leder efter. Man skal forstille sig XML filen som et træ med rod og en masse grene som igen kan have grene.
Det første trin. Microsoft har udviklet en XML object model, som tilbyder at vedligeholde og traversere XML-filer. I oktober udgav de version 3.0, men i dette eksempel vil jeg bruge version 2.0 som følger med Visual Basic 6.0. Jeg vil i dette eksempel vise hvordan man kan opbygge et lille program som holder styr på nogle personer, ved hjælp af deres navn og et medlemsnummer. Inden vi starter på selve VB programmet skal vi først have bygget en XML fil op. Dette kan gøres i f.eks Notepad. Filen ser sådanne ud:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <KARTOTEK TITEL="Medlems kartotek"> </KARTOTEK>Den første linje skal med i XML filen, da den fortæller en masse information om selve filen. F.eks bliver der her fortalt hvilken specification af XML filen er opbygget med. Derudover bliver der også fortalt hvilken encoding der bruges i filen. Jeg har valgt UTF-8 som også går under navnet Unicode. Når man bruger Unicode skulle man være rimeligt sikret mod problemer med mærkelige udenlandske tegn, da det understøtter ca. 40.000 forskellige tegn. Sidste oplysningen man kan få fra linjen er hvorvidt XML filen er selvstændig eller om den er bygget sammen med andre XML filer. I vores eksempel er den selvstændig. Herefter kan vi begynde at opbygge filen som vi synes. Da jeg vil lave et kartotek, kalder vi meget sigende det yderste element for KARTOTEK. Dette yderste element kaldes også for DocumentElement. For at beskrive mit kartotek lidt grundigere, opretter jeg en attribut som jeg kalder TITEL. Dennes værdi sætter jeg til ‘Medlems Kartotek’. Fyr op under VB.
Nu hvor vi har fået lagt fundamentet til vores program kan vi starte Visual Basic op. Her tilknytter jeg en reference til MSXML.DLL (Microsoft XML, version 2.0).
<PERSON> <MEDLNR/> <NAVN/> </PERSON>Læs denne opbygning som en rod (KARTOTEK) som har en gren (PERSON) som har nogle blade (MEDLNR & NAVN). Det første som jeg skal i mit VB program er at oprette nogle objekter som kan hjælpe mig med at bearbejde min XML fil.
Dim objXML As New MSXML.DOMDocument Dim objRoot As IXMLDOMElement Dim Person, Navn, Nr As IXMLDOMNodeFørst opretter jeg et objekt som referere til selve XML filen. (DOMDocument) Herefter et objekt som skal indeholde DocumentElement som i vores tilfælde er KARTOTEK. Til sidst opretter jeg nogle node-objekter til at indeholde navn, medlemsnummer og hele personen. Når alt dette forarbejde er gjort klar kan vi åbne selve XML filen. I dette eksempel hedder filen Lager.xml.
objXML.Load App.Path & "/Lager.xml"Næste opgave er at sætte objRoot lig med DocumentElement:
Set objRoot = objXML.documentElementVi kan nu initialisere de objekter som vi har oprettet:
Set Person = objXML.createElement("PERSON")
Set Nr = objXML.createElement("MEDLNR")
Set Navn = objXML.createElement("NAVN")
Nu skulle vores noder være klar til at få noget indhold. Det som vi gjorde herover var at oprette objekterne med de navne som de vil fremstå med i selve XML filen. Når vi skal tildele nogle værdier til disse objekter, gør man det på samme måde som man gør med de fleste andre objekter som kan indeholde en tekst. Nemlig ved hjælp af .Text.
Nr.Text = txtMedl.Text Navn.Text = txtNavn.TextDet data som vi gemmer er i dette tilfælde fra 2 textboxe (txtMedl & txtNavn). Deres værdier bliver nu gemt i XML-noderne. Indtil nu har vi ikke kigget så meget på strukturen af vores data, men nu skal vi til at fortælle VB hvordan den skal strukturere vores data.
Person.appendChild Nr Person.appendChild NavnDet som vi gør her er, at vi fortæller at Nr og Navn, skal knyttes til Person. Igen skal vi have vores grene og blade i tankerne. Alle vores data er nu knyttet til et objekt, nemlig Person. Dog har vi stadigvæk ikke fortalt hvor i selve XML filen at disse skal placeres, dette gør vi ved at knytte Person til DocumentElement. Man kunne selvfølgelig knytte den til andet end DocumentElement, men i vores tilfælde skal en Person jo knyttes til KARTOTEK.
objRoot.appendChild PersonNu mangler vi kun en ting før vi har oprettet vores første person i XML filen. Vil skal gemme vores ændringer. Det er jo i bund og grund stadigvæk en tekst fil vi arbejder på. Derfor husk denne sidste linje.
objXML.save App.Path & "/Lager.xml"At læse resultatet. Når man har oprettet en masse personer i sin XML fil, skal man jo også gerne have mulighed for at vise indholdet i nogle listboxe f.eks. Dette kan gøres ved at traversere XML filen med en silmple For-Each sætning. Jeg tester først på om der er oprettet nogle personer i kartoteket. Her bruger jeg udtrykket ChildNode. En childNode er en node som er knyttet til en anden, F.eks vil MEDLNR være en childNode til PERSON. Med denne viden skulle der ikke være de store problemer i at gennemskue dette stykke kode.
If objRoot.hasChildNodes Then
For Each node In objRoot.childNodes
lstNR.AddItem node.childNodes(0).Text
lstNavne.AddItem node.childNodes(1).Text
Next
Else
ListBox1.AddItem ("Ingen personer oprettet")
End If
De sidste bemærkninger.
Når man opbygger sin XML fil, skal man være meget opmærksom på at fejl ikke tolereres. F.eks går det ikke at man glemmer at lukke en tag eller laver en tastefejl. Indeholder filen en fejl, vil man ikke kunne arbejde på den. Derfor bruger jeg altid Internet Explorer til at teste mine XML filer med. Man åbner simpelthen bare XML filen i Exploreren og hvis der er nogle fejl i filen, bliver disse fundet her.
Dette eksempel viser kun en brøkdel af de ting man kan lave med XML formatet. Kildekoden til dette eksempel kan I selvfølge finde på hjemmesiden og prøve det derhjemme. Men pas på, har man en gang brugt XML er det svært at undvære. Status: Version 1.0 |
| Eksempel lavet af: Anders Hansen. |