XML som konfigurationsfiler

Tags:    .net
Skrevet af Bruger #2730 @ 04.12.2003

XML dokument som konfigurationsfil


Tiden er løbet fra almindelige konfigurationsfiler som .ini filer og andre måder at gemme oplysninger om brugeren eller en applikation på. XML er på mange fronter ved at danne præcedens over for alle andre filformater og utrolig mange har taget det til sig og bruger det til dagligt. XML er ideelt til mange ting, blandt andet til brug i konfigurationsfiler. Denne artikel skal vise hvordan man simpelt og effektivt kan benytte de faciliteter der er indbygget i .NET miljøet til at tilgå og benytte en XML konfigurationsfil. Alle kodeeksempler er lavet i C#, og der forudsættes et vis kendskab til C#, XML og XPath (se eventuelt www.w3schools.com).

XML dokumentet


Noget af det mest nærliggende at holde styr på i en applikation er ting som connection string til databaser, brugersettings i dit program og alt andet mellem himmel og jord. Som oftest benytter jeg XML til at konfigurere min connection string til min(e) databaser. Dette giver en dejlig fleksibilitet i og med at jeg blot skal ændre i mit XML dokument hvis jeg skifter database og ikke bekymre mit om andet. En connection string til en SQL Server database har utrolig mange settings, jeg plejer at holde mig til de mest basale (hvilket er en 4-5 stykker) og så ikke bruge resten. Normalt har jeg et XML konfigurationsdokument , der er bygget op omkring en connection string. En almindelig connection string til en SQL Server ser således ud:

Initial Catalog=Northwind;Data Source=localhost;Integrated Security=SSPI;

Normalt benytter jeg et par settings mere end det ovenstående eksempel, dette gør blot at jeg får et par ekstra elementer i min XML konfigurationsfil, men intet der kan skræmme en begyndende C# udvikler. Min XML konfigurationsfil, config.xml, kommer til at se ud som nedenstående:

Fold kodeboks ind/udKode 


Som det kan ses af mit XML dokument har jeg bygget mine elementer op omkring det de hedder i forvejen i min connection string. Dette er naturligvis ikke en nødvendighed, men så er man ikke i tvivl om hvad man skal kalde dem og ender ikke med at have latterlige intetsigende tekster som elementnavne i sin XML konfigurationsfil. Når jeg nu skal bruge det ovenstående XML dokument til at bygge en connection string efter er det eneste jeg skal gøre at sætte alle mine elementer sammen og vupti! Så har jeg min connectionstring. Hvis man er bedre end jeg, så lod man brugeren interagere så lidt som muligt med denne konfigurationsfil, eventuelt ved at mindske behovet for at skrive så meget i XMl filen, måske begrænse det til kun at skulle angive værdier.

C# koden der samler det hele


Som jeg tidligere har nævnt er XML simpelthen så dejligt et format at arbejde med fordi hele XML namespacet i .Net tilbyder så mange muligheder for udvikleren at man næppe kan ønske sig mere. Jeg har i nedenstående kodeeksempel lavet en klasse der indeholder to metoder. Jeg har for vane altid at lave en klasse der hedder DatabaseHandler når jeg arbejder med databaser, således jeg har en fornuftig struktur af min kode. DatabaseHandleren indeholder som minimum to metoder, en der åbner databasen og en der lukker databasen. Hver gang jeg således skal bruge min database kalder jeg min openDatabase() metode, laver mine database kald og afslutter min metode med at kalde closeDatabase(), så er der styr på det hele.

Fold kodeboks ind/udKode 

For at kunne arbejde med XML filer i C# skal vi benytte os af System.Xml namespacet, derfor den anden linie i ovenstående kodeeksempel. I tredje linie bruger vi System.Data.SqlClient namespacet, der gør det muligt for os at oprette forbindelse til en SQL Server database, uden disse ville vi få en farlig masse kompileringsfejl og ikke forstå hvorfor vores super smarte DatabaseHandler ikke vil som vi vil. Hvis vi nu hopper ned til metoden openDatabase() ser vi at det første vi gør er at allokere et nyt XML dokument, for umiddelbart efter at indlæse vores konfigurationsfil i dette dokument. Ikke noget hokus pokus i det her, lige ud af landevejen. Det næste der sker er nok lidt mere tricky, hvis ikke man er helt hjemme i XPath og XML. Jeg laver en string variabel og sætter den lig med den værdi der står i "PersistSecurity" elementet (tagget) i min XML fil. Dette gøres ved at kalde metoden SelectSingleNode på mit XML dokument og sende en XPath string med i denne metode der rammer det element i min XML fil jeg har brug for. HVis man sammenligner det XPath argument der bruges med config.xml dokumentet længere oppe i kodeeksemplet vil man se at der er en mening med den XPath vi sender med som argument. Det kræver ikke en udviddet maskinmester eksamen at se at det en XPath består af er teksten på de to elementer vi skal bruge, hvor "niveauerne" er adskildt med en skråstreg.

Afrunding


Det fremgår sikkert tydelig at min entuatiasme omkring .NET og XMl er stor. Jeg synes det er et lækkert værktøj at arbejde med og det giver nogle dejlige muligheder for at kunne manipulere hurtigt og sikkert med forskellige data strukturer. Denne artikel er lavet for at sæte dine egne tanker i sving og med det sagt håber jeg ikke bare du kopierer min kode, men bygger din egen variation af den med lige nøjagtigt de elementer du skal bruge. Se ud over det lille eksempel jeg har lavet og se mulighederne i det der kan laves og ikke begrænsningerne.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (7)

User
Bruger #123 @ 04.12.03 08:17
Det er da en udemærket introduktion til XML og konfiguration, men jeg må ærligt sige at jeg synes du slipper lidt for nemt om ved det. Lidt flere eksempler og grundigere gennemgang af mulighederne i XML fra .Net ville have været ønskeligt. Vi er ikke så interesseret i hvordan XML bygges op (det er der udemærkede artikler om i XML gruppen), vi er interesseret i hvordan vi skal anvende XML. Jeg kan ikke rigtigt give mere end 2 for artiklen, beklager :/
User
Bruger #2730 @ 04.12.03 08:33
Takker for kritikken, tror det må resultere i en artikel fra min side omkring de muligheder der er med .Net og XML. Skal bare lige have den udtænkt, forslag til indhold modtages gerne.
User
Bruger #123 @ 12.12.03 08:41
Det er da dejligt at du tager så pænt imod kritik, selvom det er halv-negativ.

Jeg kunne personligt godt tænke mig at se noget om hvordan man anvender XML i praksis. Jeg har selv kun snuset til xml og det fra Delphi. Jeg er på meget tynd is hvad .net angår.

Hvilke muligheder har man med xml?
hvad kan man bruge det?
Egne opsætningsmuligheder?
Egen xml "ini" fil, istedet for web.config?
osv.
User
Bruger #5789 @ 17.05.04 17:26
hvorfor oprette et nyt dokument, når man har web.config, som er webapplikationens oprindelige konfigurerings fil ? den er da også 1000 gange nemmere at hente informationer fra ?

Xml er godt... men ikke til en .Net konfigurationsfil..

/Jokke
User
Bruger #2730 @ 21.05.04 13:30
Hvorfor bruge Web.Config i en windows appikation?

Og Jo.... en XML fil er det eneste rigtige til en konfigurationsfil - men i ASP.NET web-applikationer benytter man selvfølgeligt web.config..... der er det jo også en .xml konfigurationsfil :-)
User
Bruger #4003 @ 21.12.04 17:05
Udemærket artikel. Du skriver jo det er afgrænset til XML som konfigurationsfil, og som sådan synes jeg den dækker fint. Desværre synes jeg selve måden at gribe C# klassen an på er lidt "ærgerlig", jf. nedenfor.

Du skriver at du blot skal ændre din XML fil hvis du eksempelvis skifter database. Det passer bare ikke, medmindre det tilfældigvis er præcis de samme parametre du skal køre med på den nye database. Oftest vil man dog ryge ud i, at der pludselig kommer et parameter til, eller falder et fra. Når det sker skal du ikke bare rette XML'en. Så skal du også ind og rette dine hardcodede angivelser af parametrene i C# klassen og recompilere denne.

Hvis du på et tidspunkt vælger at opdatere din artikel, eller som forslag til dem der vil tage udgangspunkt i artiklen, til opbygning af deres egen DatabaseHandler, så vil jeg anbefale følgende udvidelse, som gør klassen generel og skalérbar samtidig med, at du så rent faktisk kun skal rette XML filen når du skifter database, eller parametre falder fra og kommer til:

Hardcode kun din ydre tag <Connectionstring> i C# klassen. Lad så din openDatabase() metode gennemløbe (læse) alle underliggende tags i denne gruppe, og sammensæt din connectionstring af de parametre du finder under <Connectionstring> tag'en. Herved bliver din klasse fuldstændig ligeglad med, om der er 1 eller for den sags skyld 30 parametre.
Så er det kun XML filen der skal vedligeholdes med x-antal tags under <Connectionstring>, uden at du skal rette og recompilere din C# klasse hver gang et parameter kommer til eller falder fra ;-)

/Jon
User
Bruger #10009 @ 05.06.06 09:05
Sad lige og læste denne gamle artikel og lavede en lille stump efter ide fra ovenstående post:
Fold kodeboks ind/udKode 
Du skal være logget ind for at skrive en kommentar.
t