C# 下用 xml 导入导出数据

C# 下导入导出数据比在 VC++ 下容易了很多,基本数据类型 int, float 可以自动 box, unbox, 不需要像 c++ 下得考虑封装基本数据的问题。

 

 

              public static bool LoadObjects(string fileName, CCollectionBase objects, string type, ref string id)

              {

                     try {

                            FileStream fs = null;

                            XmlReader reader = CreateDecryptReader(fileName, m_SettingPassWord, ref fs);

                            XmlDocument doc = new XmlDocument();

                            doc.Load(reader);

                            XmlElement root = doc.DocumentElement;

                            string s = root.Name.Trim();

                            if (s != type) return false;

                            id = root.Attributes[0].Value.Trim();

                            InputObjects(root.ChildNodes, objects);

                            reader.Close();

                            if (fs != null) { fs.Close(); fs = null; }

                     }

           catch { return false; }

                     return true;

              }

 

 

       protected static bool InputObjects(XmlNodeList collection, CCollectionBase objects)

        {

            foreach (XmlNode n in collection) {

                string id = n.Attributes[0].Value.Trim();

                switch (n.Name) {

                    case "SETs" :

                        if (n.ChildNodes != null) {

                            CCollectionBase set = (CCollectionBase) (objects[id]?? objects.Add(id, new CCollectionBase()));

                            InputObjects(n.ChildNodes, set);

                        }

                        break;

                    case "STRs" :

                        string[] s = new string[n.Attributes.Count -1];

                        for (int i=0; i<s.Length; i++)

                            s[i] = n.Attributes[i+1].Value.Trim();

                        objects.Add(id, s);

                        break;

                    case "STR" :

                        objects.Add(id, n.Attributes[1].Value.Trim());

                        break;

                    case "INT":

                        objects.Add(id, int.Parse(n.Attributes[1].Value));

                        break;

                    case "INTs":

                        int[] ints = new int[n.Attributes.Count - 1];

                        for (int i = 0; i < ints.Length; i++)

                            ints[i] = int.Parse(n.Attributes[i + 1].Value);

                        objects.Add(id, ints);

                        break;

                    case "FLOAT":

                        objects.Add(id, float.Parse(n.Attributes[1].Value));

                        break;

                    case "FLOATs":

                        float[] floats = new float[n.Attributes.Count - 1];

                        for (int i = 0; i < floats.Length; i++)

                            floats[i] = float.Parse(n.Attributes[i + 1].Value);

                        objects.Add(id, floats);

                        break;

                    case "BYTEs":

                        byte[] b = new Byte[n.Attributes[1].Value.Length/2];

                        for (int i=0; i<b.Length; i++)

                            b[i] = byte.Parse(n.Attributes[1].Value.Substring(i*2, 2), System.Globalization.NumberStyles.HexNumber);

                        objects.Add(id, b);

                        break;

                                   default:

                                          if (ParseObjectsFromNode != null)

                                                 return ParseObjectsFromNode(n);

                                          return false;

                            }

            }

            return true;

        }

 

 

        public static bool SaveObjects(string fileName, CCollectionBase objects, string type, string id)

        {

            try {

                FileStream fs = null;

                XmlWriter  writer = CreateEncryptWriter(fileName, m_SettingPassWord, ref fs);

                OutputObjects(writer, type, id, objects);

                            writer.Flush();

                writer.Close();

                if (fs != null) { fs.Close(); fs = null; }

            }

            catch { return false; }

            return true;

        }

 

 

        protected static void OutputObjects(XmlWriter  writer, string type, string id, CCollectionBase objects)

        {

            writer.WriteStartElement(type);

            writer.WriteAttributeString("ID", id);

 

            for (int i = 0; i < objects.Count; i++) {

                Object obj = objects[i];

                if (obj is string) {

                    writer.WriteStartElement("STR");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    writer.WriteAttributeString("V", (string) obj);

                    writer.WriteEndElement();

                }

                else if (obj is string[]) {

                    writer.WriteStartElement("STRs");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    string[] s= (string []) obj;

                    for (int n=0; n<s.Length; n++) {

                        writer.WriteAttributeString("S"+n.ToString(), s[n]);

                    }

                    writer.WriteEndElement();

                }

                else if (obj is int) {

                    writer.WriteStartElement("INT");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    writer.WriteAttributeString("V", ((int) obj).ToString());

                    writer.WriteEndElement();

                }

                else if (obj is int[])

                {

                    writer.WriteStartElement("INTs");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    int[] s = (int[])obj;

                    for (int n = 0; n < s.Length; n++)

                    {

                        writer.WriteAttributeString("I" + n.ToString(), s[n].ToString());

                    }

                    writer.WriteEndElement();

                }

                else if (obj is float) {

                    writer.WriteStartElement("FLOAT");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    writer.WriteAttributeString("V", ((float) obj).ToString("g"));

                    writer.WriteEndElement();

                }

                else if (obj is float[])

                {

                    writer.WriteStartElement("FLOATs");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    float[] s = (float[])obj;

                    for (int n = 0; n < s.Length; n++)

                    {

                        writer.WriteAttributeString("I" + n.ToString(), s[n].ToString("g"));

                    }

                    writer.WriteEndElement();

                }

 

                else if (obj is byte[]) {

                    writer.WriteStartElement("BYTEs");

                    writer.WriteAttributeString("ID", objects.GetKey(i));

                    byte[] b= (byte[]) obj;

                    string s="";

                    for (int n=0; n<b.Length; n++) {

                        s += b[n].ToString("X2");

                    }

                    writer.WriteAttributeString("V", s);

                    writer.WriteEndElement();

                }

                else if (obj is CCollectionBase) {

                    OutputObjects(writer, "SETs", objects.GetKey(i), (CCollectionBase) obj);

                }

                 else {

                                   if (WriteObjectsToFile != null)

                                          WriteObjectsToFile(writer);

                            }

                     }

            writer.WriteEndElement();

        }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值