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
October 14, 2010 at 4:10 am
And there are so many possiblities to enhance the functionality provided by this class.