Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Fout bij inlezen XML bestand *

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 26-11 17:48
Hallo,
ik ben wat aan het klooien met C# (om precies te zijn: ik probeer een XML bestand uit te lezen in een multidemensionale array)

Ik gebruik daarvoor de volgende code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class ServerDB
{
    protected   string      ServerXMLFile;
    public      string[,]   DB;
    
    #knip    

    public ServerDB(string ServerXMLFile)
    {
        this.ServerXMLFile = ServerXMLFile;
        this.ReadServers();
    }
    
    #knip
    
    protected bool ReadServers()
    {
        try
        {
            // Open Document en laad bestand
            XmlDocument XmlReader = new XmlDocument();
            XmlReader.Load(this.ServerXMLFile);

            // verkgrijg een lijstje van alle servers
            XmlNodeList ServerList = XmlReader.GetElementsByTagName("server");
            
            // vertel de compiler hoe groot we de string willen hebben
            this.DB = new string[ServerList.Count, 3];

            // Doorloop het lijstje met servers
            for (int i = 0; i < ServerList.Count; i++)
            {
                // Verkrijg de server
                XmlNode Server = ServerList.Item(i);
                XmlNodeList ServerProperties = Server.ChildNodes;
                // doorloop de childs (=eigenschappen) van de server
                for (int j = 0; j < ServerProperties.Count; j++)
                {
                    // Verkrijg de huidige eigenschap
                    XmlNode ServerProperty = ServerProperties.Item(j);
                    // Zet de eigenschap op de juiste plaats
                    switch (ServerProperty.Name)
                    {
                        case "name":
                          this.DB[i, 0] = ServerProperty.InnerText;
                          break;
                        case "rlist":
                          this.DB[i, 1] = ServerProperty.InnerText;
                          break;
                        case "plist":
                          this.DB[i, 2] = ServerProperty.InnerText;
                          break;
                    }
                }
            }
        }
        catch (XmlException e)
        {
            // Wat foutafhandeling
            return false;
        }
        return true;
    }
}



Het XML bestand ziet er zo uit:

XML:
1
2
3
4
5
6
7
8
9
10
11
<ServerDB>
  <server>
    <name>Test</name>
    <rlist>Iets</rlist>
  </server>
  <server>
    <name>Test2</name>
    <rlist>Nogiets</rlist>
    <plist>En nog iets</rlist>
  </server>
</ServerDB>


Nou krijg ik bij het debuggen de fout "System.NullReferenceException was unhandled" bij "this.DB[i, 0] = ServerProperty.InnerText; ". Ik zou echt niet weten wat het probleem is. Het rare is dat ik onder Debug->Window->Locals wel gewoon "ServerProperty" met Name en InnerText op de juiste waarde zie staan, dus hij leest het wel. Bij datzelfde locals schermpje staat "this.DB" overigens met value "null" en type "string[,]"

Weet iemand wat ik fout doe :?

[ Voor 0% gewijzigd door een moderator op 26-09-2007 17:28 . Reden: C#, XML attribuut aan code-tags toegevoegd ]


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:29

Haan

dotnetter

Volgens de foutmelding moet je blijkbaar ook een NullReferenceException catchen, dat is tenminste wat die foutmelding zegt en dat heb jij blijkbaar niet gedaan.

Kater? Eerst water, de rest komt later


Verwijderd

Blijkbaar komt de XML parser een ServerProperty tegen zonder InnerText.
Dit kun je (een beetje, en niet netjes) defaulten naar "":
C#:
1
string.IsNullOrEmpty(ServerProperty.InnerText) ? "" : ServerProperty.InnerText

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 22:41
Je xml is niet geldig!
sluit eens af met </plist>

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 26-11 17:48
@Haan
Je kunt een exception catchen wat je wilt, je programma zal er niet door gaan werken

@Afterlife
Dat was niet het probleem, maar het is zeker handig om fouten te voorkomen :)

@Vedett
Met het geldige bestand geeft hij de fout niet meer, stom :$

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Mag ik vragen waarom je werkt met een string array in plaats van een collectie (List) van server structures? Behalve dat je nu de instellisense moet missen bij je parameters, is de kans op bugs ook nog eens groter.

Daarnaast wil ik je ook nog even wijzen op de schrijf wijzes van fields en argumenten. Als basis regel kun je aanhouden dat alles camel casing wordt geschreven (serverXml). Uitzonderingen hierop zijn classes (structures), methodes, properties en public fields. Deze worden geschreven in Pascal casing (ServerXml). Dan is er nog een derde uitzondering en dat betreft twee letterige benamingen. Deze worden volledig in hoofdletters geschreven. Ook als het een afkorting in een langere benaming zoals ClientID (ipv ClientId). Een en ander staat beschreven in de MSDN onder General Reference --> Design guidelines --> Guidelines for Names.

If it isn't broken, fix it until it is..


  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 20-11 21:40

Not Pingu

Dumbass ex machina

Niemand_Anders schreef op donderdag 27 september 2007 @ 08:55:
Daarnaast wil ik je ook nog even wijzen op de schrijf wijzes van fields en argumenten.
offtopic:
Er is geen enkele standaardrichtlijn voor C# code, behalve de richtlijnen die elke developer zelf aanhoudt. Het aanhouden van de casing van het framework wordt vaak gedaan uit gemak, maar is niet verplicht. Binnen het framework is de benaming van bijv. member variabelen ook inconsistent.

Certified smart block developer op de agile darkchain stack. PM voor info.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:16

gorgi_19

Kruimeltjes zijn weer op :9

Not Pingu schreef op donderdag 27 september 2007 @ 10:33:
[...]


offtopic:
Er is geen enkele standaardrichtlijn voor C# code, behalve de richtlijnen die elke developer zelf aanhoudt. Het aanhouden van de casing van het framework wordt vaak gedaan uit gemak, maar is niet verplicht. Binnen het framework is de benaming van bijv. member variabelen ook inconsistent.
Het is inderdaad niet verplicht, maar een richtlijn is bijvoorbeeld wel FX Cop :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 25-11 23:28
Even een klein dingetje voor de TS: ik weet niet of je ook de xml-file zelf maakt? Anders zou je ook eens naar serializatie kunnen kijken (XmlSerializer)...

Overigens heeft Microsoft wel degelijk richtlijnen gegeven voor naamgeving: .NET Naming Guidelines. (Dit zijn volgens mij ook de richtlijnen die FX Cop controleert).

[ Voor 10% gewijzigd door Flard op 27-09-2007 11:28 ]

Pagina: 1