[C#/XML] XML bestand heropenen en bewerken lukt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met de code van een bestaand elektronica project te veranderen.
Het gaat om een soort van mini-scope

Helaas is het ding te traag om zelfs te gebruiken op audio gebied, vandaar dat ik er een spannigslogger me wou maken.
De waardes worden door de µC verzonden over USB, en een C# progje dumpt ze in een XML bestand.
De µC werkt, en de communicatie ook, alleen lukt het genereren van men XML bestand niet echt geweldig.

De bedoeling is dat je de logsnelheid kan instellen, en dat op elke 'timer tick' (nui nog ff met een simpel knopje) de waarde naar het XML bestand worden geschreven.
De XML code genereren lukt, maar ik wil bvb data wegschrijven, bestand opslaan, 5min later terug openen, bijschrijven, opslaan, 5min...
Helaas ben ik er nog niet uit hoe ik het terug kan openen om data bij te schrijven.
Voor ze te lezen vind je info genoeg.

Dit is mijn code tot nu toe: (mijn kennis over C# is nihil, ik heb alles op google opgezocht)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

         string thetime = DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second;
            // string for the xml-logfile the time is in the HH-MM-S format this is because XML-files cant handle the ":" in the element tags
        string thetime_dotted = DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second;
            // string for the xml-logfile its attributes

        int measuring_nummer = 0;
        int interval_1to2 =0;
        int value_sample1 = 0;
  
        private void button1_Click(object sender, EventArgs e)
        {
        
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
                // We dictated the program to use proper indention when writing the xml by using this settings. 
            XmlWriter writer = XmlWriter.Create("logfile.xml", settings);
                // create a new xml file

            writer.WriteStartDocument();
                // start writing in the xml file

                // generating the deafault text of the logfile containing the basic info
            writer.WriteComment("-+=======================================================+-");
            writer.WriteComment("                 logfile of the USB-logger                  ");        
            writer.WriteComment("-+=======================================================+-");

            writer.WriteStartElement("log");
                writer.WriteAttributeString("start-date", DateTime.Now.ToString());
                    writer.WriteStartElement("Interval-times");
                        writer.WriteElementString("interval_1-2", Convert.ToString(interval_1to2));
                    writer.WriteEndElement();

            //****************************************************
            // Dit zou bij button 2 moeten horen
            //****************************************************
                writer.WriteStartElement("measuring");
                    writer.WriteAttributeString("nr", Convert.ToString(measuring_nummer));
                    writer.WriteAttributeString("time", thetime_dotted);
                        writer.WriteStartElement("chan1");
                            writer.WriteElementString("sample1", Convert.ToString(value_sample1));
                            writer.WriteEndElement();
               writer.WriteEndDocument();
            
            writer.Flush();
                // clean the contents of the stream
            writer.Close();
                // save the xml file, the program stops completly with using it

            //****************************************************
            // einde code button2
            //****************************************************
       
        }

        private void button2_Click(object sender, EventArgs e)
        {
         //*******************
         //  hier komt code
         //*******************       
        } 
        }
    }


het zou dit soort code moeten genereren:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<!---+=======================================================+- -->
<!--                 logfile of the USB-logger                  -->
<!---+=======================================================+- -->
<log start-date="30/08/2010 23:14:17">
  <Interval-times>
    <interval_1-2>0</interval_1-2>
  </Interval-times>
  <measuring nr="0" time="23:14:15">
    <chan1>
      <sample1>0</sample1>
    </chan1>
  </measuring>
</log>


waarom een xml bestand? Het lijkt mij het simpelste, en als ik het goed heb kan je dankzij een deftige css sheet (aloewel het niet persee hoeft) het ook openen in een internet browser waar het mooi en overzichtelijk word weergegeven.

[ Voor 134% gewijzigd door Verwijderd op 31-08-2010 10:52 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Doe ons even een lol en beperk je code tot relevante(!) delen; 100+ regels code is teveel van het goede. Je code strippen tot de bare-essentials waarmee je je probleem nog kunt reproduceren helpt jezelf bij het helder krijgen van het probleem (en misschien zelfs oplossen) en wij hoeven ons niet te buigen over zaken die niet interessant zijn.

Overigens, maar dit is even een top-of-my-head-wild-guess, zet eens een using statement om je XMLWriter ;) . En dan ga ik er even van uit dat je dus een foutmelding krijgt dat je bestand nog geopend is ofzo bij een tweede keer openen; dat wordt me uit je topic niet geheel duidelijk.

[ Voor 21% gewijzigd door RobIII op 30-08-2010 23:49 ]

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!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:43
Kan je het niet beter met een XmlDocument doen en dan elke keer child nodes appenden? Een XmlWriter is hier niet geschikt voor:
Represents a writer that provides a fast, non-cached, forward-only means of generating streams or files containing XML data

[ Voor 26% gewijzigd door sig69 op 31-08-2010 10:58 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beter?

Zoals de code er nu staat werkt het wel, maar doet het niet wat ik wil.
Maar mijn bedoeling is dat er elk uur 1 bestand word aangemaakt (dat lukt)
De hoofding word geschreven. (lukt ook)
Het wordt opgeslagen (lukt ook)
Terug word geopent (lukt niet)
En dat er dan waardes worden weggeschreven in het 'logboek', eens gedaan met schrijven, wordt het terug opgeslagen en dan bvb 5min later heropent wanneer er opnieuw waardes moeten worden weggeschreven. (en hier gaat het ook fout)

Dus het probleem, hoe open ik een XML bestand opnieuw, en hoe ga ik naar een bepaalde plaats in het bestand voor verder te schrijven, vlak voor </log>.
Om het simpel te houden wou ik het met simpele drukknopjes eerst proberen, drukknop 1= hoofding, drukknop 2= data wegschrijven.
En zo mijn programma verder opbouwen tot het doet wat ik wil.

Hopelijk is het nu duidelijk(er)

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:43
Verwijderd schreef op dinsdag 31 augustus 2010 @ 11:03:
Beter?

Zoals de code er nu staat werkt het wel, maar doet het niet wat ik wil.
Maar mijn bedoeling is dat er elk uur 1 bestand word aangemaakt (dat lukt)
De hoofding word geschreven. (lukt ook)
Het wordt opgeslagen (lukt ook)
Terug word geopent (lukt niet)
Wat lukt niet? Weet je niet hoe het moet? Krijg je een foutmelding?
En dat er dan waardes worden weggeschreven in het 'logboek', eens gedaan met schrijven, wordt het terug opgeslagen en dan bvb 5min later heropent wanneer er opnieuw waardes moeten worden weggeschreven. (en hier gaat het ook fout)

Dus het probleem, hoe open ik een XML bestand opnieuw, en hoe ga ik naar een bepaalde plaats in het bestand voor verder te schrijven, vlak voor </log>.
Zoals ik zei, dit kan niet met een XmlWriter.
Om het simpel te houden wou ik het met simpele drukknopjes eerst proberen, drukknop 1= hoofding, drukknop 2= data wegschrijven.
En zo mijn programma verder opbouwen tot het doet wat ik wil.

Hopelijk is het nu duidelijk(er)
Niet helemaal. Je wil elk uur een xml bestand maken en daar elke 5 minuten wat nodes aan toevoegen?

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

Gewoon een XmlDocument gebruiken lijkt me simpel genoeg toch?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik weet niet hoe het moet.
Op de meeste sites doen ze het met die xmlwriter, en voor xmldocument vind ik niet meteen een mooi en vooral duidelijk voorbeeld.

De snelheid waarmee er word gelogd kan worden ingesteld, maar dat zou me in principe moeten lukken (heb wat VB gehad op school en het lijkt een klein beetje op elkaar op't eerste zicht)
Nu wil ik het eerst aan de praat krijgen met drukknoppen, je moet niet gaan lopen als je nog niet kan wandelen ;)

edit: ondertussen ben ik aan het googlen op die xmldocument, en het heeft niet echt nut als iedereen naar dezelfde site linkt...

[ Voor 12% gewijzigd door Verwijderd op 31-08-2010 12:04 ]


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 03:43
Klik dan even door naar de members en dan zie je een ton aan nuttige informatie.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voordat er iemand denkt dat ik weer zo'n noob ben die hoopt een kant en klaar antwoord te krijgen, ziehier men code die (in princiepe) hetzelfde doet als die in men eerste post.
(begin nou niet weer te klagen en zagen over die +100 regels, op deze manier heb je vanzelf veel code + er zit nog wat kommentaar bij)

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        string filename = "logfile" + "__" + DateTime.Now.Day + "-" + DateTime.Now.Month + "-" + DateTime.Now.Year + "__" + DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second + ".xml";
        // name for the logfiles in the following format logfile__DD-MM-YY__HH-MM-SS.xml
        string thetime = DateTime.Now.Hour + "-" + DateTime.Now.Minute + "-" + DateTime.Now.Second;
        // string for the xml-logfile the time is in the HH-MM-S format this is because XML-files cant handle the ":" in the element tags
        string thetime_dotted = DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second;
        // string for the xml-logfile its attributes

        int measuring_nummer = 0;
        int interval_1to2 = 0;
        int value_sample1 = 0;
 
        private void button1_Click(object sender, EventArgs e)
        {
            XmlDocument xmllog = new XmlDocument();
            XmlElement logElement = xmllog.CreateElement("log");
                XmlAttribute startAttribute = xmllog.CreateAttribute("start-date");
                    logElement.SetAttributeNode(startAttribute);
                    startAttribute.Value = DateTime.Now.ToString();
               
            XmlComment newComment;
            XmlElement root = xmllog.DocumentElement;
                newComment = xmllog.CreateComment("add comments");
                xmllog.InsertBefore(newComment, root);
                newComment = xmllog.CreateComment("2nd comment line");
            
                xmllog.InsertBefore(newComment, root);
           
                XmlElement intervalElement = xmllog.CreateElement("interval_times");
                    logElement.AppendChild(intervalElement);
                        XmlElement interval_time_1to2_Element = xmllog.CreateElement("interval_1-2");
                                interval_time_1to2_Element.InnerText = Convert.ToString(interval_1to2);
                            intervalElement.AppendChild(interval_time_1to2_Element);

                       xmllog.AppendChild(logElement);
            xmllog.Save("logfile.xml");
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Create an XML Document
            XmlDocument xmllog = new XmlDocument();

            //Load in the users xml file
            try
            {
                xmllog.Load("logfile.xml");
            }
            catch (Exception err)
            {
                //Wrong file name, not written well, or the file doesnt exist at all
               MessageBox.Show("error:" + err.Message);
            }

            //Create your new node that you want to add the attributes to
            XmlNode logNode = xmllog.CreateElement("measuring");
                //Create a new attribute assign the value and append it to the new node.
                //Repeat this until all attributes have been added
                XmlAttribute nrAttribute = xmllog.CreateAttribute("nr");
                    nrAttribute.Value = Convert.ToString(measuring_nummer);
                logNode.Attributes.Append(nrAttribute);
                XmlAttribute timeAttribute = xmllog.CreateAttribute("time");
                    timeAttribute.Value = thetime_dotted;
                logNode.Attributes.Append(timeAttribute);

            XmlElement measurementElement = xmllog.CreateElement("channel");
                logNode.AppendChild(measurementElement);
                XmlAttribute chan_nr_Attribute = xmllog.CreateAttribute("nr");
                    chan_nr_Attribute.Value = ("1");
                chan_nr_Attribute.Attributes.Append(chan_nr_Attribute);
                    XmlElement sample_Element = xmllog.CreateElement("sample_1");
                        sample_Element.InnerText = Convert.ToString(value_sample1);
                    measurementElement.AppendChild(sample_Element);

            //Append the new node to the document
            xmllog.DocumentElement.AppendChild(logNode);

            //Save the document
            xmllog.Save("logfile.xml"); 
        }

    }
}


Op deze manier werkt het wel een pak omslachtiger dan op men eerste manier (kan ook aan mij liggen)
Moest ik op de een of andere manier de code kunnen optimaliseren, k'hoor het graag :)

nuttige sites:
http://p2p.wrox.com/xml/3...insert-data-xml-file.html
http://www.kirupa.com/net/writingXML_pg1.htm
en waarschijnlijk heb ik er wel eenje vergeten...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[FIXED]

nieuw technisch probleem...
Ik heb men code gekopieerd naar het project waarin ik XML bestanden wil genereren inlcusief de "using system.Xml" maar hij geeft de volgende error:
Error 1 The type or namespace name 'xml' does not exist in the namespace 'System' (are you missing an assembly reference?)

Hoe komt dit en vooral, hoe kan ik dit verhelpen?

e/: Ik gebruik wel een DLL voor informatie over de USB bus binnen te lezen.
e/2: Ik heb een vergelijkbaar probleem zoals hier: http://forums.silverlight.net/forums/p/20408/70328.aspx
maar ik snap niet echt hoe hij het heeft kunnen oplossen. :?
[/FIXED]
opgelost door deze manier van werken te volgen:
1. Right click on the References folder on your project.
2. Select Add Reference.
3. Select the .NET tab (or select the Browse button if it is not a .NET Framework assembly).
4. Double-click the assembly containing the namespace in the error message.
5. Press the OK button.

[ Voor 53% gewijzigd door Verwijderd op 05-09-2010 21:20 ]

Pagina: 1