Toon posts:

[C#] XmlReader doorgeven aan deelfuncties

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een monitor tooltje aan het maken. Deze moet bijvoorbeeld bepaalde processen in de gaten kunnen houden, logfiles kunnen analyseren en bv filesize van bepaalde files kunnen checken.

Ik wil de configuratie in een grote XML file.

bijvoorbeeld:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
<config>
    <processmonitor>
        <process warninglevel="1" number="2">notepad</process>
        <process warninglevel="2" number="2">mspaint</process>
        <process warninglevel="3" number="1">winlogon</process>
        <process warninglevel="3" number="1">workpace</process>
    </processmonitor>
    <logfilemonitor>
        <file path="foo.log">
            <string warninglevel="1">ERROR</string>
            <string warninglevel="2">WARNING</string>
            <string warninglevel="3">TEST</string>
        </file>
        <file path="bar.log">
            <string warninglevel="3">PIET</string>
            <string warninglevel="2">WARNING</string>
            <string warninglevel="1">TEST</string>
        </file>
    </logfilemonitor>
</config>


Nu wil ik het volgende bereiken. Ik wil een algemene ConfigReader functie. Deze leest de XML file door (met XmlReader). Zodra hij het <processmonitor> element tegenkomt moet hij de XmlReader doorgeven aan een functie die het <processmonitor></processmonitor> gedeelte uitleest, en dan weer terug gaat zodat de algemene ConfigReader kan doorgaan naar bv het <filemonitor> gedeelte.

dit is de algemene ConfigReader:
code:
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
    public void ReadConfig(string ConfigPath)
    {
    //Validate the config file with the DTD
    XmlReader ConfigReader = new XmlTextReader(ConfigPath);
    XmlValidatingReader reader = new XmlValidatingReader(ConfigReader);
    reader.ValidationType = ValidationType.DTD;


    //Read Config File
    while (ConfigReader.Read())
    {
    //Node is no end-element
    if (ConfigReader.NodeType == XmlNodeType.Element)
    {
    //Read element names
    switch (ConfigReader.LocalName) 
    {
        //Read root element
    case "config":
    {
        break;
    }
    case "processmonitor":
    {
        MainProcessMonitor = new Monitor.GenericMonitor.ProcessMonitor();
        Console.WriteLine("processmonitor: \t" + MainProcessMonitor.ReadConfig(ConfigReader));
        
        break;
    }
    case "logfilemonitor":
    {
        

        MainLogMonitor = new Monitor.GenericMonitor.LogMonitor();
        Console.WriteLine("logfilemonitor: \t" + MainLogMonitor.ReadConfig(ConfigReader));
        break;
    }
            (...)


dus, voor elke case word de ConfigReader van het desbetreffende onderdeel aangeroepen.

De ConfigReaders voor elk onderdeel hebben een soortgelijke structuur, alleen word hierin de informatie die in de Xml file staat verwerkt.

op zich werkt dit idee goed, het enige probleem is dat als een element childs heeft, hij deze niet goed leest. Volgens mij moet ik iets van:

code:
1
2
3
while (ConfigReader.Read( ) && (ConfigReader.NodeType == XmlNodeType.Element || 
    ConfigReader.NodeType == XmlNodeType.Whitespace))
         {


in de while loop zetten boven aan bij de deel ConfigReaders, alleen ik heb dit geprobeerd (op diverse manieren), maar dit heeft niet het gewenste resultaat.

Kan iemand me helpen met dit probleem?

[ Voor 11% gewijzigd door Verwijderd op 07-11-2005 10:45 ]


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

(jarig!)
Is het misschien niet handiger om ipv een XmlReader een XmlDocument te gebruiken. Het kost wat meer (geheugen) maar het is wel stukken handiger aangezien je gelijk XPath kunt gebruiken.
Je krijgt dan bijvoorbeeld zoiets:
C#:
1
2
3
4
5
6
7
8
XmlDocument doc = new XmlDocument();
doc.LoadXml("<xml><config>bla bla bla</config>");

XmlNodeList processes = doc.SelectNodes("config/processmonitor");

foreach(XmlNode process in processes) {
     // Doe meuk met een proces
}

Het scheelt nogal wat gehannes met zelf alles 1 voor 1 uitlezen.

Nu met Land Rover Series 3 en Defender 90