[C#]DateTime veld in Xml verschillend weggeschreven

Pagina: 1
Acties:

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 09:03
Hallo allemaal,

een beetje een wazige topictitel, ik weet t, maar ik zal het uitleggen.

Ik moet voor een logger een groot array van klasses wegschrijven in een XML bestand. Dit doe ik met behulp van de XmlSerializer klasse. Deze Serializer schrijft het DateTime veld als de volgende waarde weg:
code:
1
<Timestamp>2007-03-15T18:08:59.5106663+01:00</Timestamp>


Deze Serializer klasse kan echter niet zonder meer later iets toevoegen aan het bestand. Hiervoor laad ik het XML bestand in een instantie van XmlDocument, voeg toe wat ik toe wil voegen en schrijf het bestand weer weg. Dit gebeurd echter op een andere manier:
code:
1
<Timestamp>15-3-2007 18:08:59</Timestamp>


Een paar stukjes code om de implementatie van de Serializer en de 'appender' weer te geven
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
/* Onderstaande code zal ongetwijfeld netter kunnen ;) */

class XMLSerializer
{
       XmlTextWriter xtw;
       XmlTextReader xtr;

       public void openTextWriter(string fname)
        {
            xtw = new XmlTextWriter(fname, Encoding.UTF8);
            xtw.Formatting = Formatting.Indented;
        }

        public void closeTextWriter()
        {
            xtw.Close();
        }

        public void openTextReader(string fname)
        {
            xtr = new XmlTextReader(fname);
        }

        public void closeTextReader()
        {
            xtr.Close();
        }

        public void SerializeObject(Packet[] pckArr)
        {
            XmlSerializer xs = new XmlSerializer(typeof(Packet[]));
            xs.Serialize(xtw,pckArr);
        }

        public void appendPacket(Packet pck)
        {
            XmlDocument doc = new XmlDocument();
            openTextReader();
            doc.Load(xtr);
            closeTextReader();
            XmlElement elPacket = doc.CreateElement("Packet");

            string elK0 = "<Timestamp>" + pck.Timestamp + "</Timestamp>";
            string elK1 = "<From>" + pck.From + "</From>";
            string elK2 = "<To>" + pck.To + "</To>";
            string elK3 = "<Data>" + pck.Data + "</Data>";
            string elK4 = "<Status>" + pck.Status + "</Status>";

            elPacket.InnerXml = elK0 + elK1 + elK2 + elK3 + elK4;
            doc.DocumentElement.AppendChild(elPacket);
            openTextWriter();
            doc.Save(xtw);
            closeTextWriter();  
        }
}


Zowel de Serializer als de appendPacket maakt gebruikt van dezelfde TextReader en Writer, maar toch wordt het anders weggeschreven.

In eerste instantie laadde ik rechtstreeks de XML file in het XmlDocument, maar omdat ik dacht dat het met de utf8 encoding had te maken, heb ik de TextReader en Writer gebruikt. Hier heeft het echter niet mee te maken.

Wat ik wel met succes geprobeerd heb is het invoeren van de Ticks i.p.v. een leesbare datum. De 'klant' wil echter een leesbare XML file, en Ticks zijn nou niet bepaald leesbaar ;)

Als ik de get-methode van de private Timestamp opvraag, worden deze in de MessageBox zowel in Serializer als in appendPacket hetzelfde weergegeven.

Hoe de datum uiteindelijk weggeschreven zal worden (Serializer manier, of andere manier) maakt niet zo heel veel uit.
Iemand een idee?

edit:

Deze had dus in programming moeten staan, en niet in SE&A volgens...

[ Voor 9% gewijzigd door RvL op 15-03-2007 19:26 . Reden: Toevoegingen ]

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

En een move naar PRG

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Hoe de datum uiteindelijk weggeschreven zal worden (Serializer manier, of andere manier) maakt niet zo heel veel uit.
*Rrrrrrrrrgg* - Fout ;)

Ik weet wel dat je waarschijnlijk bedoelt dat het jou niet zoveel uitmaakt, maar voor .NET maakt het wel veel uit. DateTime waarden zoals die in een XML document worden weggeschreven moeten aan een speciaal formaat voldoen (volgens de XML specificatie), terwijl een myDateTime.ToString() in principe elk formaat kan en mag hebben.

Kijk eens naar de XmlConvert class, die schrijft je DateTimes in hetzelfde formaat weg. :)

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 09:03
Ah kijk, zover had ik me nog niet nog niet in de XML specificatie verdiept! Ik zal er eens naar kijken. Mij persoonlijk zal het inderdaad worst wezen hoe het weggeschreven wordt, maar specificatie is specificatie.

Dank je wel voor de tip!

Update:
Inderdaad is het probleem nu opgelost, en wel met de volgende code:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public void appendPacket(Packet pck, string fname)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(fname);
            XmlElement elPacket = doc.CreateElement("Packet");

            string dt = XmlConvert.ToString(pck.Timestamp, XmlDateTimeSerializationMode.Local);          
            string elK0 = "<Timestamp>" + dt + "</Timestamp>";
            string elK1 = "<From>" + pck.From + "</From>";
            string elK2 = "<To>" + pck.To + "</To>";
            string elK3 = "<Data>" + pck.Data + "</Data>";
            string elK4 = "<Status>" + pck.Status + "</Status>";

            elPacket.InnerXml = elK0 + elK1 + elK2 + elK3 + elK4;
            doc.DocumentElement.AppendChild(elPacket);
            doc.Save(fname);
        }


Dit is de nieuwe methode appendPacket, waarin het DateTime veld uit het Packet eerst met XmlConvert wordt omgezet naar een volgens de XML specificatie geldige notatie.

[ Voor 68% gewijzigd door RvL op 15-03-2007 23:04 ]

Liefde maakt een smal bed breed!
Nu de dekens nog...