Avatar billede Simon Praktikant
10. september 2006 - 00:01 Der er 13 kommentarer og
1 løsning

gemme og hente key value i en streng

Findes der en klasse som er velegnet til både at håndtere key/values, og som samtidig kan gemme hente og gemme i en streng.

ArrayList er for eksempel velegnet til key/value:

eks.
ArrayList al = new ArrayList();
al.Add("myKey", "myVal");

Men jeg ønsker mulighed for at gemme og hente i en streng som jeg kan opbevare i en celle i en database.
Avatar billede coderdk Praktikant
10. september 2006 - 00:37 #1
Kan du ikke bruge noget XML serialization?
Avatar billede arne_v Ekspert
10. september 2006 - 01:16 #2
Du mener Hashtable/Dictionary ikke ??

XML var ihvertfald en oplagt mulighed - om det så lige skal være XmlSerializer
elle rnoget andet kan diskuteres
Avatar billede Simon Praktikant
10. september 2006 - 10:33 #3
Jo det har jeg også overvejet, men der skal man selv skrive en del kode for at serialize og deserialize. Dertil kommer at XmlSerializer ikke virker på HashTables
(http://blogs.msdn.com/psheill/archive/2005/04/09/406823.aspx)
Findes der ikke en klasse som nemt kan håndtere key/values, og som selv kan outputte dem til en streng. Og læse sine key/values fra en streng, evt. i konstruktøren.
Avatar billede arne_v Ekspert
10. september 2006 - 16:42 #4
det er meget nemt selv at lave en serialisering til/deserialisering fra XML
af en Hashtable

jeg kender ikke en indbygget klasse i .NET som gør det du efterspørger
Avatar billede Simon Praktikant
11. september 2006 - 12:45 #5
Kan du henvise til et kodeeksempel, hvor der serializes til/fra xml af en HashTable. Så er point dine
Avatar billede arne_v Ekspert
11. september 2006 - 12:59 #6
jeg kan lave et eksempel
Avatar billede arne_v Ekspert
11. september 2006 - 13:18 #7
et hurtigt stykke kode

using System;
using System.Collections;
using System.Xml;

namespace E
{
    public class MainClass
    {
        public static string Hashtable2String(Hashtable ht)
        {
            XmlDocument doc = new XmlDocument();
            doc.AppendChild(doc.CreateElement("all"));
            foreach(DictionaryEntry de in ht)
            {
                XmlElement e = doc.CreateElement("entry");
                XmlElement k = doc.CreateElement("key");
                XmlElement v = doc.CreateElement("value");
                k.AppendChild(doc.CreateTextNode((string)de.Key));
                v.AppendChild(doc.CreateTextNode((string)de.Value));
                e.AppendChild(k);
                e.AppendChild(v);
                doc.DocumentElement.AppendChild(e);
            }
            return doc.OuterXml;
        }
        public static Hashtable String2Hashtable(string s)
        {
            Hashtable res = new Hashtable();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(s);
            XmlNodeList all = doc.GetElementsByTagName("entry");
            foreach(XmlElement e in all)
            {
                string k = e.ChildNodes[0].FirstChild.Value;
                string v = e.ChildNodes[1].FirstChild.Value;
                res.Add(k, v);
            }
            return res;
        }
        public static void Main(string[] args)
        {
            Hashtable ht = new Hashtable();
            ht.Add("key1", "val1");
            ht.Add("key2", "val2");
            ht.Add("key3", "val3");
            string s = Hashtable2String(ht);
            Console.WriteLine(s);
            Hashtable ht2 = String2Hashtable(s);
            Console.WriteLine(ht2["key1"]);
            Console.WriteLine(ht2["key2"]);
            Console.WriteLine(ht2["key3"]);
        }
    }
}

det forudsætter at Hashtable mapper fra string til string
Avatar billede Simon Praktikant
13. september 2006 - 21:55 #8
Tak, det var meget fornemt. smid svar så får du point.
Avatar billede arne_v Ekspert
13. september 2006 - 22:55 #9
svar
Avatar billede arne_v Ekspert
13. september 2006 - 22:55 #10
<, > og & skal vist iøvrigt escapes for at den er sikker
Avatar billede Simon Praktikant
14. september 2006 - 10:55 #11
Tænker du på at Escape således at

k.AppendChild(doc.CreateTextNode((string)de.Key));

erstattes af:

String KeyString = ((string)de.Key);
KeyString = KeyString.Replace("<","\<");
KeyString = KeyString.Replace(">","\>");
KeyString = KeyString.Replace("&","\&");
k.AppendChild(doc.CreateTextNodeKeyString);
Avatar billede Simon Praktikant
14. september 2006 - 10:57 #12
... glemte lige parenteserne, skulle se således ud:

String KeyString = ((string)de.Key);
KeyString = KeyString.Replace("<","\<");
KeyString = KeyString.Replace(">","\>");
KeyString = KeyString.Replace("&","\&");
k.AppendChild(doc.CreateTextNode(KeyString));
Avatar billede arne_v Ekspert
15. september 2006 - 00:10 #13
ved nærmere eftertanke tror jeg faktisk at de bliver escapet automatisk af .NET, så
glem det
Avatar billede arne_v Ekspert
15. september 2006 - 00:11 #14
ellers er det iøvrigt:

&gt;
&lt;
&amp;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester