Utility to use XML file as a DataSource – C#

I have written a small utility which can be used to access xml file as a datasource for a single table.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;
using System.Xml;

namespace XMLDataSource
{
    ///

    /// Main data object class
    /// 

    public class DataObject
    {
        public List Properties = new List();
        public bool IsIdentityRequired = false;
    }

    ///

    /// Data types supported
    /// 

    public enum DataType
    {
        Int = 1,
        String = 2,
        Bool = 3,
        DateTime = 4,
        Image = 5
    }

    ///

    /// XML structure
    /// 

    public class XMLStructure
    {
        public int Index { get; set; }
        public string FieldName { get; set; }
        public DataType FieldType { get; set; }
    }

    ///

    /// Data for each cell
    /// 

    public class XMLData : XMLStructure, IComparable
    {
        public object Data { get; set; }

        #region IComparable Members

        public int CompareTo(XMLData other)
        {
            return Index.CompareTo(other.Index);
        }

        #endregion
    }

    ///

    /// Data access class
    /// 

    public class DataAccess
    {
        public static string XMLFilePath = string.Empty;

        ///

        /// Create the xml file specified in XMLFilePath variable.
        /// If file already exists, It deletes the file and create a new file.
        /// 

        /// Overrite the file
        /// true if process is successful
        public static bool Instantiate(bool overrite)
        {
            try
            {
                if (overrite == true)
                {
                    if (File.Exists(XMLFilePath))
                    {
                        File.Delete(XMLFilePath);
                    }
                }
                //File.Create(XMLFilePath);
                if (!File.Exists(XMLFilePath))
                {
                    //writing basic structure to the xml file
                    StringBuilder sb = new StringBuilder();
                    sb.AppendLine("");
                    sb.AppendLine("");
                    sb.AppendLine("");

                    StreamWriter sw = new StreamWriter(XMLFilePath);
                    sw.Write(sb.ToString());
                    sw.Flush();
                    sw.Close();
                }
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        ///

        /// Insert a new record in the xml file
        /// 

        ///
        ///
        public static bool InsertRecord(DataObject row)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(XMLFilePath);

            if (row.IsIdentityRequired == true)
            {
                XmlNodeList elements = xDoc.GetElementsByTagName("Item");
                int identity_value = (Convert.ToInt32((elements.Count == 0 ? "1" : elements[elements.Count - 1].SelectSingleNode("Identity").InnerText)) + 1);
                row.Properties.Add(new XMLData() { Index = -1, FieldType = DataType.Int, FieldName = "Identity", Data = identity_value });
            }

            row.Properties.Sort();

            XmlElement element = xDoc.CreateElement("Item");
            foreach (XMLData nodes in row.Properties)
            {
                XmlElement innerElement = xDoc.CreateElement(nodes.FieldName);
                switch (nodes.FieldType)
                {
                    case DataType.Int:
                        innerElement.InnerText = Convert.ToInt32(nodes.Data).ToString();
                        innerElement.SetAttribute("Type", "Int");
                        break;
                    case DataType.String:
                        innerElement.InnerText = Convert.ToString(nodes.Data);
                        innerElement.SetAttribute("Type", "String");
                        break;
                    case DataType.Bool:
                        innerElement.InnerText = Convert.ToBoolean(nodes.Data).ToString();
                        innerElement.SetAttribute("Type", "Bool");
                        break;
                    case DataType.DateTime:
                        innerElement.InnerText = Convert.ToDateTime(nodes.Data).ToString();
                        innerElement.SetAttribute("Type", "DateTime");
                        break;
                    case DataType.Image:
                        System.Drawing.Image I = (System.Drawing.Image)nodes.Data;
                        MemoryStream ms = new MemoryStream();
                        I.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        innerElement.InnerText = Convert.ToBase64String(ms.ToArray());
                        innerElement.SetAttribute("Type", "Image");
                        break;
                }
                element.AppendChild(innerElement);
            }
            xDoc.SelectSingleNode("Data").AppendChild(element);
            xDoc.Save(XMLFilePath);
            return true;
        }

        ///

        /// retrives all the records from the database
        /// 

        ///
        public static List GetAllRecords()
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(XMLFilePath);

            XmlNodeList elements = xDoc.GetElementsByTagName("Item");
            List lst = new List();
            foreach (XmlNode e in elements)
            {
                int nodeIndex = 0;
                DataObject d = new DataObject();
                foreach (XmlNode n in e.ChildNodes)
                {
                    XMLData xmlData = new XMLData();
                    DataType type = (DataType)Enum.Parse(typeof(DataType), n.Attributes["Type"].Value.ToString(), true);
                    switch (type)
                    {
                        case DataType.Int:
                            xmlData.Index = nodeIndex;
                            xmlData.FieldType = DataType.Int;
                            xmlData.FieldName = n.Name;
                            xmlData.Data = Convert.ToInt32(n.InnerText);
                            break;
                        case DataType.String:
                            xmlData.Index = nodeIndex;
                            xmlData.FieldType = DataType.String;
                            xmlData.FieldName = n.Name;
                            xmlData.Data = Convert.ToString(n.InnerText);
                            break;
                        case DataType.Bool:
                            xmlData.Index = nodeIndex;
                            xmlData.FieldType = DataType.Bool;
                            xmlData.FieldName = n.Name;
                            xmlData.Data = Convert.ToBoolean(n.InnerText);
                            break;
                        case DataType.DateTime:
                            xmlData.Index = nodeIndex;
                            xmlData.FieldType = DataType.DateTime;
                            xmlData.FieldName =


 n.Name;
                            xmlData.Data = Convert.ToDateTime(n.InnerText);
                            break;
                        case DataType.Image:
                            byte[] arr = Convert.FromBase64String(n.InnerText);
                            MemoryStream ms = new MemoryStream(arr);
                            System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);

                            xmlData.Index = nodeIndex;
                            xmlData.FieldType = DataType.Image;
                            xmlData.FieldName = n.Name;
                            xmlData.Data = returnImage;
                            break;
                    }
                    nodeIndex++;
                    d.Properties.Add(xmlData);
                }
                lst.Add(d);
            }
            return lst;
        }

        ///

        /// retrives matching record from the database
        /// 

        ///
        public static DataObject GetByKey(XMLData key)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(XMLFilePath);

            XmlNode element = xDoc.SelectSingleNode(@"/Data/Item[" + key.FieldName + "=" + Convert.ToString(key.Data) + "]");

            int nodeIndex = 0;
            DataObject d = new DataObject();
            foreach (XmlNode n in element.ChildNodes)
            {
                XMLData xmlData = new XMLData();
                DataType type = (DataType)Enum.Parse(typeof(DataType), n.Attributes["Type"].ToString(), true);
                switch (type)
                {
                    case DataType.Int:
                        xmlData.Index = nodeIndex;
                        xmlData.FieldType = DataType.Int;
                        xmlData.FieldName = n.Name;
                        xmlData.Data = Convert.ToInt32(n.InnerText);
                        break;
                    case DataType.String:
                        xmlData.Index = nodeIndex;
                        xmlData.FieldType = DataType.String;
                        xmlData.FieldName = n.Name;
                        xmlData.Data = Convert.ToString(n.InnerText);
                        break;
                    case DataType.Bool:
                        xmlData.Index = nodeIndex;
                        xmlData.FieldType = DataType.Bool;
                        xmlData.FieldName = n.Name;
                        xmlData.Data = Convert.ToBoolean(n.InnerText);
                        break;
                    case DataType.DateTime:
                        xmlData.Index = nodeIndex;
                        xmlData.FieldType = DataType.DateTime;
                        xmlData.FieldName = n.Name;
                        xmlData.Data = Convert.ToDateTime(n.InnerText);
                        break;
                    case DataType.Image:
                        byte[] arr = Convert.FromBase64String(n.InnerText);
                        MemoryStream ms = new MemoryStream(arr);
                        System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);

                        xmlData.Index = nodeIndex;
                        xmlData.FieldType = DataType.Image;
                        xmlData.FieldName = n.Name;
                        xmlData.Data = returnImage;
                        break;
                }
                nodeIndex++;
                d.Properties.Add(xmlData);
            }

            return d;
        }

        ///

        /// Update record in the xml file
        /// 

        ///
        ///
        public static bool UpdateRecord(DataObject row, XMLData key)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(XMLFilePath);

            row.Properties.Sort();

            XmlNode element = xDoc.SelectSingleNode(@"/Data/Item[" + key.FieldName + "=" + Convert.ToString(key.Data) + "]");

            foreach (XMLData nodes in row.Properties)
            {
                XmlNode innerElement = element.SelectSingleNode(nodes.FieldName);
                switch (nodes.FieldType)
                {
                    case DataType.Int:
                        innerElement.InnerText = Convert.ToInt32(nodes.Data).ToString();
                        break;
                    case DataType.String:
                        innerElement.InnerText = Convert.ToString(nodes.Data);
                        break;
                    case DataType.Bool:
                        innerElement.InnerText = Convert.ToBoolean(nodes.Data).ToString();
                        break;
                    case DataType.DateTime:
                        innerElement.InnerText = Convert.ToDateTime(nodes.Data).ToString();
                        break;
                    case DataType.Image:
                        System.Drawing.Image I = (System.Drawing.Image)nodes.Data;
                        MemoryStream ms = new MemoryStream();
                        I.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        innerElement.InnerText = Convert.ToBase64String(ms.ToArray());
                        break;
                }
            }

            xDoc.Save(XMLFilePath);
            return true;
        }

        ///

        /// Delete record in the xml file
        /// 

        ///
        ///
        public static bool DeleteRecord(XMLData key)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(XMLFilePath);
            XmlNode element = xDoc.SelectSingleNode(@"/Data/Item[" + key.FieldName + "=" + Convert.ToString(key.Data) + "]");
            if (element == null)
                return true;
            xDoc.SelectSingleNode("Data").RemoveChild(element);
            xDoc.Save(XMLFilePath);
            return true;
        }
    }
}

Example of how to use this class :

using System;
using System.IO;
using System.Xml;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

using XMLDataSource;

namespace ReadAndWriteInXML
{
    class Program
    {
        static void Main(string[] args)
        {

            DataAccess.XMLFilePath =
                 @"E:\Examples\ParallelTest\ReadAndWriteInXML\DB_XMLDATASOURCE.XML";

            DataAccess.Instantiate(false);

            XMLDataSource.DataObject row = new XMLDataSource.DataObject() { IsIdentityRequired = true};

            //XMLData xmlData_Id = new XMLData() { Index = 0, FieldName = "Id", FieldType = DataType.Int, Data = 1 };
            //XMLData xmlData_Name = new XMLData() { Index = 1, FieldName = "Name", FieldType = DataType.String, Data = "Lokesh" };
            //row.Properties.Add(xmlData_Id);
            //row.Properties.Add(xmlData_Name);

            //DataAccess.InsertRecord(row);

            List lst = DataAccess.GetAllRecords();

            XMLData xmlData_Id = new XMLData() { Index = 0, FieldName = "Id", FieldType = DataType.Int, Data = 1 };
            XMLData xmlData_Name = new XMLData() { Index = 1, FieldName = "Name", FieldType = DataType.String, Data = "Lucky" };
            row.Properties.Add(xmlData_Id);
            row.Properties.Add(xmlData_Name);

            DataAccess.UpdateRecord(row, xmlData_Id);
        }
    }
}

I will also upload the link to download the dll.

zp8497586rq
Tags: , , , ,
Subscribe to Comments RSS Feed in this post

One Response

  1. And there are so many possiblities to enhance the functionality provided by this class.