[C#] XML uitlezen - wegschrijven (lees: XML waardes updaten)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dames en Heren,

Ik ben vrij nieuw in deze programmeertaal, dit is de derde week dat ik hiermee aan de slag ga. Ik loop tegen het volgende aan:

-Uitlezen van XML in C#.
-Via een switch/case of if/else specifieke handelingen uitvoeren voor bepaalde nodes.
-XML waardes updaten/wegschrijven.

Ik heb de o.a. de volgende websites al bezocht maar ik wordt er gewoon maar niet wijzer van :(.
- How to read XML from a file by using Visual C#
- http://www.developer.com/...XML-File-Data-Using-C.htm
- http://www.functionx.com/vcsharp/xml/Lesson01.htm
- http://www.c-sharpcorner....dWriteXMLTutMellli21.aspx

Elke methode die ik vindt is weer anders en ben dus niet zeker wat nou de juist methodiek is om mijn doel te bereiken.

Beschrijving
Ik heb het volgende bestand xml bestand:
XML:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8" ?>
<connsettings>
  <connectionstring name="DataBaseConnection1">
    <enc>0</enc>
    <dbconn>Persist Security Info=True</dbconn>
    <datasource>DataBaseServerAdress</datasource>
    <datasourcetable>DataBaseTableName</datasourcetable>
    <uid>UniqueUserId</uid>
    <pw>PassWord</pw>
  </connectionstring>
</connsettings>


Ik wil nu in C# dus per <connectionstring> uitlezen wat de waardes zijn en op basis van de waarde van <enc> een handeling uitvoeren.

Wat ik tot nu toe heb is dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
 XmlTextReader xml = new XmlTextReader(Server.MapPath("App_data/dbconn.xml"));
        while (xml.Read())
        {
            // Move to fist element
            xml.MoveToElement();
            System.Diagnostics.Debug.WriteLine("=======================================");
            System.Diagnostics.Debug.WriteLine(xml.Name);
            if (xml.Name == "enc")
            {
                System.Diagnostics.Debug.WriteLine("Encryption status = " + xml.Value);
            }
        }

Dit resulteert in:
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
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
65
66
67
68
=======================================
xml
=======================================

=======================================
connsettings
=======================================

=======================================
connectionstring
=======================================

=======================================
enc
Encryption status = 
=======================================

=======================================
enc
Encryption status = 
=======================================

=======================================
dbconn
=======================================

=======================================
dbconn
=======================================

=======================================
datasource
=======================================

=======================================
datasource
=======================================

=======================================
datasourcetable
=======================================

=======================================
datasourcetable
=======================================

=======================================
uid
=======================================

=======================================
uid
=======================================

=======================================
pw
=======================================

=======================================
pw
=======================================

=======================================
connectionstring
=======================================

=======================================
connsettings


Het doel is dat wanneer <enc> == 0 dat ik de resterende gegevens ophaal, door een encrypter haal, daarna weer wegschrijf op dezelfde plek. Hierna wordt <enc> op 1 gezet zodat het de volgende keer de gegevens niet weer encrypt maar enkel uitleest.

Na het encrypten worden de gegevens weer gedecrypt zodat er een goede connectionstring gemaakt kan worden.

Zoals je hierboven ziet krijg ik het niet eens voor mekaar om de waarde van <enc> uit te lezen...


Ik sta open voor verbeteringen in elk opzicht aangezien ik te weinig kennis heb van deze taal en waarschijnlijk flink wat fouten heb gemaakt. Het te behalen doel is een echter een must, oftewel: het is nodig dat ik deze gegevens op een bepaalde manier ophaal, gebaseerd op de 0/1 van enc eventueel de gegevens nog moet encrypten, en indien nodig weer weg schrijf.

Ik vraag dus aan de tweakers:
-Hoe kan ik op een juiste manier mijn xml bestand uitlezen?
-Hoe kan ik, indien er extra handelingen zijn verricht, dit weer wegschrijven naar het bestand?

Bij voorbaat dank ik iedereen die mij op de juiste weg helpt!

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Verwijderd schreef op maandag 08 februari 2010 @ 11:20:
Ik vraag dus aan de tweakers:
-Hoe kan ik op een juiste manier mijn xml bestand uitlezen?
-Hoe kan ik, indien er extra handelingen zijn verricht, dit weer wegschrijven naar het bestand?

Bij voorbaat dank ik iedereen die mij op de juiste weg helpt!
Ik denk dat je je node.innertext en niet node.value moet gebruiken om de waarde te lezen :).

Verder laad ik meestal een xmlfile via:
C#:
1
2
3
4
5
6
XmlDocument xml = new XmlDocument();
            try
            {
                xml.Load(filename);
            }
...


En daarna parse ik het zo:
C#:
1
2
3
4
5
6
7
8
9
10
11
//hier is het xml bestand input
 if(input.GetElementsByTagName(root).Count > 0)            
            {                
                foreach (XmlNode node in input.GetElementsByTagName(root)[0].ChildNodes)
                {
                    switch (node.Name)
                    {
                            case "something":
                              //doe iets
                            break;
...


(in jouw geval is root "connsettings")

Maar er zijn inderdaad 1000 manier om xml files te lezen, ik vind dit normaal het makkelijkste maar andere manieren zijn niet percee minder goed.

Door er een XmlDocument van te maken kun je ook makkelijker waarde veranderen (simpelweg door iets met de node te doen).

Saven is ook makkelijker met een XmlDocument:
C#:
1
xml.Save("filename.txt");


Edit: sorry voor de dubbele edit, maar ik dacht met code wordt het wat makkelijker

[ Voor 111% gewijzigd door roy-t op 08-02-2010 15:11 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:05

Haan

dotnetter

Ik zou inderdaad ook de XmlDocument class gebruiken, is veel handiger.
Daarna zou ik het zelf iets anders parsen door gebruik te maken van XPath, dan krijg je iets als*:
C#:
1
2
3
4
5
6
// dit geeft een lijst van alle 'connectionstring' nodes
XmlNodeList connections = xml.SelectNodes("connectionstring");
foreach (XmlNode connection in connections)
{
    // doe iets
}


*code niet getest, ook XPath query kan verkeerd zijn

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Waarom niet gewoon in de app.config en dit eventueel encrypten met de tools die daarvoor voorhanden zijn?

Edit:
Ik sta open voor verbeteringen in elk opzicht aangezien ik te weinig kennis heb van deze taal en waarschijnlijk flink wat fouten heb gemaakt. Het te behalen doel is een echter een must, oftewel: het is nodig dat ik deze gegevens op een bepaalde manier ophaal, gebaseerd op de 0/1 van enc eventueel de gegevens nog moet encrypten, en indien nodig weer weg schrijf.
Ik had hier niet overheen gelezen, maar omdat je doel volgens mij het gecodeerd opslaan van je connectionstrings is en je weinig ervaring met de taal/omgeving hebt wijs ik je de richting van een bestaande oplossing in plaats van het wiel opnieuw proberen uit te vinden.

Edit2:
Als het om ASP.NET gaat kan het zelfs nog makkelijker.

[ Voor 74% gewijzigd door riezebosch op 08-02-2010 20:40 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
roy-t schreef op maandag 08 februari 2010 @ 15:04:
[...]


Ik denk dat je je node.innertext en niet node.value moet gebruiken om de waarde te lezen :).

Verder laad ik meestal een xmlfile via:
C#:
1
2
3
4
5
6
XmlDocument xml = new XmlDocument();
            try
            {
                xml.Load(filename);
            }
...


En daarna parse ik het zo:
C#:
1
2
3
4
5
6
7
8
9
10
11
//hier is het xml bestand input
 if(input.GetElementsByTagName(root).Count > 0)            
            {                
                foreach (XmlNode node in input.GetElementsByTagName(root)\[0].ChildNodes)
                {
                    switch (node.Name)
                    {
                            case "something":
                              //doe iets
                            break;
...


(in jouw geval is root "connsettings")

Maar er zijn inderdaad 1000 manier om xml files te lezen, ik vind dit normaal het makkelijkste maar andere manieren zijn niet percee minder goed.

Door er een XmlDocument van te maken kun je ook makkelijker waarde veranderen (simpelweg door iets met de node te doen).

Saven is ook makkelijker met een XmlDocument:
C#:
1
xml.Save("filename.txt");


Edit: sorry voor de dubbele edit, maar ik dacht met code wordt het wat makkelijker
Super! Ik zal dit gelijk toepassen! En wat betreft je dubbele edit, je hebt gelijk: het is een stuk duidelijker!
Haan schreef op maandag 08 februari 2010 @ 15:18:
Ik zou inderdaad ook de XmlDocument class gebruiken, is veel handiger.
Daarna zou ik het zelf iets anders parsen door gebruik te maken van XPath, dan krijg je iets als*:
C#:
1
2
3
4
5
6
// dit geeft een lijst van alle 'connectionstring' nodes
XmlNodeList connections = xml.SelectNodes("connectionstring");
foreach (XmlNode connection in connections)
{
    // doe iets
}


*code niet getest, ook XPath query kan verkeerd zijn
Ook bedankt voor jou voorbeeld, ik zie nu dus dat ik het als object benader en daar ene foreach overheen kan gooien! Daar heb ik echt wat aan!
riezebosch schreef op maandag 08 februari 2010 @ 20:23:
Waarom niet gewoon in de app.config en dit eventueel encrypten met de tools die daarvoor voorhanden zijn?

Edit:

[...]

Ik had hier niet overheen gelezen, maar omdat je doel volgens mij het gecodeerd opslaan van je connectionstrings is en je weinig ervaring met de taal/omgeving hebt wijs ik je de richting van een bestaande oplossing in plaats van het wiel opnieuw proberen uit te vinden.

Edit2:
Als het om ASP.NET gaat kan het zelfs nog makkelijker.
Ik ben blij dat je hier toch nog over begon, ;). Ik had vergeten te melden dat ik bekend ben met deze methode echter dient het nog op andere servers te worden ingezet, en deze encryption is gebaseerd op een unique windows machine id oid. En ik weet dat je er een key in kan zetten zodat het weer wel deployable is, echter wil ik maar 1 of 2 specifieke waardes te encrypten en niet een hele section.

En het is inderdaad voor in ASP.NET. Dus ja ik ben bezig om het wiel opnieuw uit te vinden eigenlijk...maar het is en een leerdoel en een must voor het project (dat niet de hele section <connectionstring> en/of <connsettings> worden ge-encrypt) dus vindt ik het niet erg. Bedankt dat je me er toch nog op wees ;).

Ik zal snel terugkoppelen wat ik met jullie informatie heb kunnen bereiken!

Acties:
  • 0 Henk 'm!

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

Niemand_Anders

Dat was ik niet..

Het mag misschien aan mij liggen, maar waarom bevat de connectiestring van een website (gecontroleerde omgeving) uberhaupt een username en password. Als je de website (Phisical Path Credentails via Advanced settings) onder de juiste user draait, dan kun je met integrated authentication ook via die user de database benaderen.

Wij gebruiken deze connection string:
Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;

en dan is er ook geen enkele reden om uberhaupt (delen van) de web.config te encrypten.

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Niemand_Anders schreef op dinsdag 09 februari 2010 @ 10:55:
Het mag misschien aan mij liggen, maar waarom bevat de connectiestring van een website (gecontroleerde omgeving) uberhaupt een username en password. Als je de website (Phisical Path Credentails via Advanced settings) onder de juiste user draait, dan kun je met integrated authentication ook via die user de database benaderen.

Wij gebruiken deze connection string:
Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;

en dan is er ook geen enkele reden om uberhaupt (delen van) de web.config te encrypten.
De beste reden waar ik mee kan komen, naast het feit dat dit allemaal leerdoelen zijn (bekend worden met de taal en dergelijke), is dat deze applicatie zometeen connection strings gaat gebruiken van meerdere servers waaronder servers die niet van ons zijn. En ik weet niet zeker of de MS-SQL server op dezelfde server draait als de website.

Dit is echter wel een super handige functie om in de toekomst te gebruiken!!!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heren,

Met jullie input heb ik het volgende geschreven:
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
// XMLDocument Object aanmaken
        XmlDocument xml = new XmlDocument();
        try
        {
            // Laden van het xml document
            xml.Load(Server.MapPath("App_data/dbconn.xml"));
            System.Diagnostics.Debug.WriteLine("=================================================");
            System.Diagnostics.Debug.WriteLine("Succesfully loaded XML file, parsing now:");
            System.Diagnostics.Debug.WriteLine("=================================================");
            // Tellen of er uberhaupt nodes in connsettings zit
            if (xml.GetElementsByTagName("connsettings").Count > 0)
            {
                // Overgooien van childnodes uit xml[connectionstring] naar connections
                XmlNodeList connections = xml.SelectNodes("connectionstring");
                // Elk childnode doorlopen
                foreach (XmlNode connection in connections)
                {
                    System.Diagnostics.Debug.WriteLine(connection.Name + ":" + connection.InnerText);
                    System.Diagnostics.Debug.WriteLine("=================================================");
                }
            }
        }
        catch (Exception error)
        {
            System.Diagnostics.Debug.WriteLine("Exception caught." + error);
        }


Het resultaat is:
code:
1
2
3
=================================================
Succesfully loaded XML file, parsing now:
=================================================


Wat zie ik over het hoofd/vergeet ik/doe ik verkeerd? :P

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 09 februari 2010 @ 11:30:
Wat zie ik over het hoofd/vergeet ik/doe ik verkeerd? :P
Je debugged niet: Debuggen: Hoe doe ik dat?

We zitten hier niet om je aan je handje vast te houden: een beetje zelf je best doen is hier wel een vereiste. Je code + output neerplempen en ons laten zoeken naar de fout is gewoon asociaal als je niet even de moeite neemt zélf even te kijken waar de fout kan zitten. En dat kun je prima doen als je dus even debugged.

[ Voor 35% gewijzigd door RobIII op 09-02-2010 11:42 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op dinsdag 09 februari 2010 @ 11:41:
[...]

Je debugged niet: Debuggen: Hoe doe ik dat?

We zitten hier niet om je aan je handje vast te houden: een beetje zelf je best doen is hier wel een vereiste. Je code + output neerplempen en ons laten zoeken naar de fout is gewoon asociaal als je niet even de moeite neemt zélf even te kijken waar de fout kan zitten. En dat kun je prima doen als je dus even debugged.
voor zover ik weet krijg ik geen fouten uit mijn debugger :S het is gewoon leeg....en ik maak gebruik van breakpoints :). Wellicht is het gewoon dat k totaal niet weet waar het fout gaat ?? Zoals vermeld, ik ben hier niet mee bekend en ik vraag advies en niet een kant en klare oplossing.....toch ? Andere woorden: ik vindt je reactie overdreven :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het volgende verwerkt:
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
        // XMLDocument Object aanmaken
        XmlDocument xml = new XmlDocument();
        try
        {
            // Laden van het xml document
            xml.Load(Server.MapPath("App_data/dbconn.xml"));
            System.Diagnostics.Debug.WriteLine("=================================================");
            System.Diagnostics.Debug.WriteLine("Succesfully loaded XML file, parsing now:");
            System.Diagnostics.Debug.WriteLine("=================================================");
            // Tellen of er uberhaupt nodes in connsettings zit
            if (xml.GetElementsByTagName("connsettings").Count > 0)
            {
                // Overgooien van childnodes uit xml[connectionstring] naar connections
                XmlNodeList connections = xml.SelectNodes("connsettings");
                // Elk childnode doorlopen
                foreach (XmlNode connection in connections)
                {
                    System.Diagnostics.Debug.WriteLine(connection.Name + ":" + connection.InnerText);
                    System.Diagnostics.Debug.WriteLine("=================================================");
                }
            }
        }
        catch (Exception error)
        {
            System.Diagnostics.Debug.WriteLine("Exception caught." + error);
        }


En ik krijg nu:
code:
1
2
3
4
5
=================================================
Succesfully loaded XML file, parsing now:
=================================================
connsettings:0Persist Security Info=TrueDataBaseServerAdressDataBaseTableNameUniqueUserIdPassWord
=================================================


Is het dan niet dat ik dan mijn xml moet aanpassen van:
XML:
1
<node>waarde</node>

naar
XML:
1
<node value="waarde"/>


Of ben ik in mijn code gewoon fout bezig?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:05

Haan

dotnetter

Verwijderd schreef op dinsdag 09 februari 2010 @ 11:47:
[...]

voor zover ik weet krijg ik geen fouten uit mijn debugger :S het is gewoon leeg....en ik maak gebruik van breakpoints :). Wellicht is het gewoon dat k totaal niet weet waar het fout gaat ?? Zoals vermeld, ik ben hier niet mee bekend en ik vraag advies en niet een kant en klare oplossing.....toch ? Andere woorden: ik vindt je reactie overdreven :)
Ik kan de reactie heel goed begrijpen, want je post een stuk code, met de vraag waar het fout gaat. Ongeacht welke programmeertaal je ooit hebt gebruikt, zou je toch vrij snel moeten zien wat er fout gaat als je tijdens het debuggen door de code loopt.
Ik zie dat regel 9 nog bereikt is, daarna zit er blijkbaar een fout in je code. Dat kan zijn omdat je check in regel 11 geen result geeft, of dat het ophalen van XmlNodes in regel 14 geen resultaat geeft. Aan jou de taak om daar achter te komen ;)
Zoals ik eerder postte, heb ik mijn codevoorbeeld niet getest, en ik zie het letterlijk terugkomen in jouw code, dus kijk daar eens naar zou ik zeggen :)

[ Voor 26% gewijzigd door Haan op 09-02-2010 11:57 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op dinsdag 09 februari 2010 @ 11:56:
[...]

Ik kan de reactie heel goed begrijpen, want je post een stuk code, met de vraag waar het fout gaat. Ongeacht welke programmeertaal je ooit hebt gebruikt, zou je toch vrij snel moeten zien wat er fout gaat als je tijdens het debuggen door de code loopt.
Ik zie dat regel 9 nog bereikt is, daarna zit er blijkbaar een fout in je code. Dat kan zijn omdat je check in regel 11 geen result geeft, of dat het ophalen van XmlNodes in regel 14 geen resultaat geeft. Aan jou de taak om daar achter te komen ;)
Zoals ik eerder postte, heb ik mijn codevoorbeeld niet getest, en ik zie het letterlijk terugkomen in jouw code, dus kijk daar eens naar zou ik zeggen :)
Nou als er 2 mensen al dit gevoel krijgen dan zit ik fout en bied ik daar mijn oprechte excuses voor aan. Dit is niet de indruk die ik wil opwekken!!
RobIII schreef op dinsdag 09 februari 2010 @ 11:41:
[...]

Je debugged niet: Debuggen: Hoe doe ik dat?

We zitten hier niet om je aan je handje vast te houden: een beetje zelf je best doen is hier wel een vereiste. Je code + output neerplempen en ons laten zoeken naar de fout is gewoon asociaal als je niet even de moeite neemt zélf even te kijken waar de fout kan zitten. En dat kun je prima doen als je dus even debugged.
Sorry voor mijn reactie!

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Verwijderd schreef op dinsdag 09 februari 2010 @ 11:54:
Ik heb het volgende verwerkt:
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
        // XMLDocument Object aanmaken
        XmlDocument xml = new XmlDocument();
        try
        {
            // Laden van het xml document
            xml.Load(Server.MapPath("App_data/dbconn.xml"));
            System.Diagnostics.Debug.WriteLine("=================================================");
            System.Diagnostics.Debug.WriteLine("Succesfully loaded XML file, parsing now:");
            System.Diagnostics.Debug.WriteLine("=================================================");
            // Tellen of er uberhaupt nodes in connsettings zit
            if (xml.GetElementsByTagName("connsettings").Count > 0)
            {
                // Overgooien van childnodes uit xml[connectionstring] naar connections
                XmlNodeList connections = xml.SelectNodes("connsettings");
                // Elk childnode doorlopen
                foreach (XmlNode connection in connections)
                {
                    System.Diagnostics.Debug.WriteLine(connection.Name + ":" + connection.InnerText);
                    System.Diagnostics.Debug.WriteLine("=================================================");
                }
            }
        }
        catch (Exception error)
        {
            System.Diagnostics.Debug.WriteLine("Exception caught." + error);
        }


En ik krijg nu:
code:
1
2
3
4
5
=================================================
Succesfully loaded XML file, parsing now:
=================================================
connsettings:0Persist Security Info=TrueDataBaseServerAdressDataBaseTableNameUniqueUserIdPassWord
=================================================


Is het dan niet dat ik dan mijn xml moet aanpassen van:
XML:
1
<node>waarde</node>

naar
XML:
1
<node value="waarde"/>


Of ben ik in mijn code gewoon fout bezig?
Wat je nu doet is dat je alle innertext pakt in connsettings:
XML:
1
2
3
4
5
6
    <enc>0</enc> 
    <dbconn>Persist Security Info=True</dbconn> 
    <datasource>DataBaseServerAdress</datasource> 
    <datasourcetable>DataBaseTableName</datasourcetable> 
    <uid>UniqueUserId</uid> 
    <pw>PassWord</pw>


Maar je moet eerst nog even door de elementen in connsettings lopen en dan de node kiezen die je wilt hebben en daar de innertext van pakken. :)

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
roy-t schreef op dinsdag 09 februari 2010 @ 12:28:
[...]


Wat je nu doet is dat je alle innertext pakt in connsettings:
XML:
1
2
3
4
5
6
    <enc>0</enc> 
    <dbconn>Persist Security Info=True</dbconn> 
    <datasource>DataBaseServerAdress</datasource> 
    <datasourcetable>DataBaseTableName</datasourcetable> 
    <uid>UniqueUserId</uid> 
    <pw>PassWord</pw>


Maar je moet eerst nog even door de elementen in connsettings lopen en dan de node kiezen die je wilt hebben en daar de innertext van pakken. :)
Hier had ik ook even aan gedacht, ben toen maar een nivo dieper gaan graven maar kwam met dezelfde uitkomst. Heb hier toen niet meer naar gekeken totdat jij mij er op wees. Ik ben nu zo ver dat ik de structuur kan uitlezen echter gebruik ik wel 3 for statements :S In mijn ogen niet efficiënt :S:S.

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
// XMLDocument Object aanmaken
XmlDocument xml = new XmlDocument();
try
{
    // Laden van het xml document
    xml.Load(Server.MapPath("App_data/dbconn.xml"));
    System.Diagnostics.Debug.WriteLine("=================================================");
    System.Diagnostics.Debug.WriteLine("Succesfully loaded XML file, parsing now:");
    System.Diagnostics.Debug.WriteLine("=================================================");
    // Kijken of er uberhaupt nodes in connsettings zit
    if (xml.HasChildNodes)
    {
        for (int iconnsettings = 0; iconnsettings < xml.ChildNodes.Count; iconnsettings++)
        {
            for (int iconnectionstring = 0; iconnectionstring < xml.ChildNodes[iconnsettings].ChildNodes.Count; iconnectionstring++)
            {
                for (int inodes = 0; inodes < xml.ChildNodes[iconnsettings].ChildNodes[iconnectionstring].ChildNodes.Count; inodes++)
                {
                    System.Diagnostics.Debug.WriteLine(xml.ChildNodes[iconnsettings].ChildNodes[iconnectionstring].ChildNodes[inodes].Name + ": " + xml.ChildNodes[iconnsettings].ChildNodes[iconnectionstring].ChildNodes[inodes].InnerText);
                    System.Diagnostics.Debug.WriteLine("=================================================");   
                }
            }
        }
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("No childnodes found! Clearly you'r doing something wrong, genious!!");
        System.Diagnostics.Debug.WriteLine("=================================================");
    }
}
catch (Exception error)
{
    System.Diagnostics.Debug.WriteLine("Exception caught." + error);
}


Resultaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
=================================================
Succesfully loaded XML file, parsing now:
=================================================
enc: 0
=================================================
dbconn: Persist Security Info=True
=================================================
datasource: DataBaseServerAdress
=================================================
datasourcetable: DataBaseTableName
=================================================
uid: UniqueUserId
=================================================
pw: PassWord
=================================================


Iemand wellicht een punt van verbetering ? (en zeg niet lullig: alles! want dan voel ik me nog slechter ;)).

Thanks in advance!

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:05

Haan

dotnetter

Dat moet gewoon in 1 for(each) loop kunnen hoor. Verder zou ik me eerst eens verdiepen in de debugger,want debuggen door wat output weg te schrijven is niet bepaald efficiënt zullen we maar zeggen ;)

Ik mag er vanuit gaan dat je Visual Studio gebruikt voor je programma? Want de debugger van Visual Studio werkt fantastisch als je eenmaal door hebt hoe je die gebruikt (en zo lastig is het niet).

Dus: weg met die regels die debug-output wegschrijven, en lekker met de debugger aan de slag.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Omdat je al weet welke elementen er zijn kun je natuurlijk ook gewoon dit doen:
C#:
1
2
3
input = input.GetElementsByTagName("niveau0");
input = input.GetElementsByTagName("niveau1");
input = input.GetElementsByTagName("niveau2");

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Andere benadering..

Je kunt er in dit geval voor kiezen om classes te maken die matchen met het schema van het XML bestand. Met de XmlSerializer deserialiseer je de XML naar een .NET object, volgens pas je de properties aan, of wat je dan ook met dat object wilt... en daarna serialiseer je hem weer terug naar XML.

http://msdn.microsoft.com...zation.xmlserializer.aspx

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
roy-t schreef op dinsdag 09 februari 2010 @ 15:12:
Omdat je al weet welke elementen er zijn kun je natuurlijk ook gewoon dit doen:
C#:
1
2
3
input = input.GetElementsByTagName("niveau0");
input = input.GetElementsByTagName("niveau1");
input = input.GetElementsByTagName("niveau2");
Ja dat is eigenlijk indd best een stuk slimmer dan wat ik nu gemaakt heb :P
Mephix schreef op dinsdag 09 februari 2010 @ 18:36:
Andere benadering..

Je kunt er in dit geval voor kiezen om classes te maken die matchen met het schema van het XML bestand. Met de XmlSerializer deserialiseer je de XML naar een .NET object, volgens pas je de properties aan, of wat je dan ook met dat object wilt... en daarna serialiseer je hem weer terug naar XML.

http://msdn.microsoft.com...zation.xmlserializer.aspx
Als ik het goed begrijp wordt elke laag een element in het object? Dan zou ik dat dus, als een soort array, kunnen benaderen en doorspoelen ??


Ik heb trouwens de volgende code nu, en het werkt super!! Heb meer in dat XPath zitten zoeken tbh.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
XmlDocument xml = new XmlDocument();
        xml.Load(Server.MapPath("App_data/dbconn.xml"));
        XmlNode root = xml.DocumentElement;
        XmlNodeList nodeList = root.SelectNodes("descendant::connectionstring[enc='0']");
        if (nodeList.Count > 0)
        {
            //Use an XmlNode object to iterate through the XmlNodeList that SelectNodes returns. 
            foreach (System.Xml.XmlNode node in nodeList)
            {
                node.SelectSingleNode("enc").InnerText = "1";
                node.SelectSingleNode("pw").InnerText = Encrypt(node.SelectSingleNode("pw").InnerText);
            }
            xml.Save(Server.MapPath("App_data/dbconn.xml"));
        }


Bron: http://www.codeproject.com/KB/cpp/myXPath.aspx

[ Voor 1% gewijzigd door Verwijderd op 10-02-2010 09:56 . Reden: Bron toevoegen ]


Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Verwijderd schreef op woensdag 10 februari 2010 @ 09:55:

Als ik het goed begrijp wordt elke laag een element in het object? Dan zou ik dat dus, als een soort array, kunnen benaderen en doorspoelen ??
Ik begrijp eerlijk gezegd je reactie in z'n geheel niet, dus ik ga er even voor het gemak vanuit dat jij mijn stuk ook niet hebt begrepen :+

Ok, stukje meer achtergrond info.

Je kunt in .NET je objecten serialiseren naar XML. Oftewel, je pakt een object met properties, haalt die door een serializer en wat daar uit komt is een stuk XML waarin de waardes van je properties staan.

Bijv (ff snel, dit is geen werkende code)

public class Persoon
{
public string Naam {get; set; }
}

Je maakt maakt daar een nieuw object van:

Persoon Kees = new Persoon();

en je vult z'n naam in:

Kees.Naam = "Kees";

Als je nu dit object serialiseert, dan hou je de volgende XML over:

<Persoon>
<Naam>Kees</Naam>
</Persoon>

En als je dit stuk XML weer deserialiseert, dan krijg je weer een object van het type Persoon, waarbij de Naam property gevuld is met de waarde "Kees".

(note: je kunt met attributes allerlei zaken bepalen, zoals bijv. of een property een xml element of een xml attribute wordt bij serialisatie, zie XmlElementAttribute en XmlAttributeAttribute, niet alles wordt dus per-se een element).

Als je nu dus een class maakt in .NET, die dezelfde structuur heeft als de XML die je inleest, dan kun je de XML deserialiseren en op die manier nieuwe instanties van die class terugkrijgen, waarbij de properties gevuld zijn op basis van de inhoud van het XML document.

Dus, in jouw geval:

XmlDocument doc = XmlDocument.Load("connectionstrings.xml");
Connection conn = Deserialize(XmlDocument);

Je kunt dan in .NET alles met dat object doen, wat je normaal ook met objecten kan, zoals bijvoorbeeld een property uitlezen of wijzigen:

string connectionString = conn.ConnectionString;
etc.

Wanneer je klaar bent met het object, wil je de wijzigingen weer terug schrijven naar de XML. Wat je dan doet is het object weer serialiseren:

XmlDocument doc = Serialize(conn);

En de dan verkregen XML schrijf je weer terug naar het xml connectionstrings.xml bestand.

Goed, zoals ik al zei: dit is slechts een andere benadering en als je het gevoel hebt dat hier niet zomaar uit gaat komen, gebruik dan vooral de methode die je tot nu toe hebt gebruikt, zeker als die werkt ;)

Mocht je tijd over hebben, raad ik je zeker aan om je (meer) te verdiepen in de XmlSerializer, het kost je misschien even wat tijd om het te snappen, maar het is zeker een betere methode dan nodes uitlezen. De hoeveelheid code is ook minder, omdat serialize / deserialize met 1 a 2 regels code is te bouwen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mephix schreef op woensdag 10 februari 2010 @ 12:01:
[...]


Ik begrijp eerlijk gezegd je reactie in z'n geheel niet, dus ik ga er even voor het gemak vanuit dat jij mijn stuk ook niet hebt begrepen :+

Ok, stukje meer achtergrond info.

Je kunt in .NET je objecten serialiseren naar XML. Oftewel, je pakt een object met properties, haalt die door een serializer en wat daar uit komt is een stuk XML waarin de waardes van je properties staan.

Bijv (ff snel, dit is geen werkende code)

public class Persoon
{
public string Naam {get; set; }
}

Je maakt maakt daar een nieuw object van:

Persoon Kees = new Persoon();

en je vult z'n naam in:

Kees.Naam = "Kees";

Als je nu dit object serialiseert, dan hou je de volgende XML over:

<Persoon>
<Naam>Kees</Naam>
</Persoon>

En als je dit stuk XML weer deserialiseert, dan krijg je weer een object van het type Persoon, waarbij de Naam property gevuld is met de waarde "Kees".

(note: je kunt met attributes allerlei zaken bepalen, zoals bijv. of een property een xml element of een xml attribute wordt bij serialisatie, zie XmlElementAttribute en XmlAttributeAttribute, niet alles wordt dus per-se een element).

Als je nu dus een class maakt in .NET, die dezelfde structuur heeft als de XML die je inleest, dan kun je de XML deserialiseren en op die manier nieuwe instanties van die class terugkrijgen, waarbij de properties gevuld zijn op basis van de inhoud van het XML document.

Dus, in jouw geval:

XmlDocument doc = XmlDocument.Load("connectionstrings.xml");
Connection conn = Deserialize(XmlDocument);

Je kunt dan in .NET alles met dat object doen, wat je normaal ook met objecten kan, zoals bijvoorbeeld een property uitlezen of wijzigen:

string connectionString = conn.ConnectionString;
etc.

Wanneer je klaar bent met het object, wil je de wijzigingen weer terug schrijven naar de XML. Wat je dan doet is het object weer serialiseren:

XmlDocument doc = Serialize(conn);

En de dan verkregen XML schrijf je weer terug naar het xml connectionstrings.xml bestand.

Goed, zoals ik al zei: dit is slechts een andere benadering en als je het gevoel hebt dat hier niet zomaar uit gaat komen, gebruik dan vooral de methode die je tot nu toe hebt gebruikt, zeker als die werkt ;)

Mocht je tijd over hebben, raad ik je zeker aan om je (meer) te verdiepen in de XmlSerializer, het kost je misschien even wat tijd om het te snappen, maar het is zeker een betere methode dan nodes uitlezen. De hoeveelheid code is ook minder, omdat serialize / deserialize met 1 a 2 regels code is te bouwen.
Heej bedankt voor je duidelijke uitleg!

Wat ik fout is om gelijkenis te zoeken naar methodes die ik in PHP gebruik, zodat ik het makkelijker kan begrijpen wat er staat. Maar dat moet ik maar niet doen denk ik... ;)

Anyways, dit is erg duidelijk en ik zie er nu al zeker voordelen in!!! Ik zal dit helaas niet toepassen in mijn huidig project aangezien ik nu een goed werkende oplossing heb. Tenzij jou methode minder intensief is? (lees: minder tijd inneemt om te executen??).

Aan ieder:

Hartstikke bedankt voor jullie input!!!

Acties:
  • 0 Henk 'm!

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 15-03 08:21
Verwijderd schreef op woensdag 10 februari 2010 @ 13:22:
Wat ik fout is om gelijkenis te zoeken naar methodes die ik in PHP gebruik, zodat ik het makkelijker kan begrijpen wat er staat. Maar dat moet ik maar niet doen denk ik... ;)
Nouja, als je OO programmeert in PHP dan zijn er wel gelijkenissen natuurlijk. Als je dat niet doet hou je denk ik niet veel meer over dan dat in C# ook een ; aan het einde van de regel staat :P
Verwijderd schreef op woensdag 10 februari 2010 @ 13:22:
Anyways, dit is erg duidelijk en ik zie er nu al zeker voordelen in!!! Ik zal dit helaas niet toepassen in mijn huidig project aangezien ik nu een goed werkende oplossing heb. Tenzij jou methode minder intensief is? (lees: minder tijd inneemt om te executen??).
Oh, als je 1 waarde uit een reeds bestaand XmlDocument object wilt lezen, bijv. met een XPath, dan zal dat vast de snelste methode zijn. Als je met een stapel for-loop-jes (liefst nog genest ook) een hele serie waardes wilt inlezen, dan zou ik zeker even naar XmlSerializer kijken.

Snelheid is dan niet het enige aspect natuurlijk, het hebben van een object in .NET vind ik ook wel (heul veul) waard.
Pagina: 1