Xml其结构化的存储方式和数据DataTable其结构本身就有共性,两个可建立一系列的转化类库。
using
System;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.IO;
using System.Web;
using System.Collections;
namespace Beasyer.Lib
... {
[DataObject(true)]
public abstract class TodoXmlDataObject
...{
private DataSet _ds;
private DataSet DataSet
...{
get
...{
if (_ds == null)
...{
_ds = new DataSet();
_ds.ReadXmlSchema(XsdFile);
LoadData();
}
return _ds;
}
}
private DataTable Table
...{
get ...{ return DataSet.Tables[0]; }
}
protected abstract string RootPath
...{
get;
}
protected abstract bool CanReadStream
...{
get;
}
protected virtual bool CanWriteStream
...{
get ...{ return true; }
}
protected abstract Stream XmlStream
...{
get;
}
protected abstract string XsdFile
...{
get;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataView Select(string sortkey)
...{
Table.DefaultView.Sort = sortkey;
return Table.DefaultView;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataView Select()
...{
return Table.DefaultView;
}
[DataObjectMethod(DataObjectMethodType.Insert)]
public int Insert(Hashtable ht)
...{
DataRow dr = Table.NewRow();
foreach (DictionaryEntry de in ht)
...{
dr[de.Key.ToString()] = de.Value.ToString();
}
Table.Rows.Add(dr);
SaveChanges();
return 1;
}
[DataObjectMethod(DataObjectMethodType.Update)]
public virtual int Update(Hashtable ht, int Original_ItemID)
...{
DataRow[] rows = Table.Select(String.Format("ItemID={0}", Original_ItemID));
if (rows.Length > 0)
...{
DataRow dr = rows[0];
dr.BeginEdit();
foreach (DictionaryEntry de in ht)
...{
dr[de.Key.ToString()] = de.Value.ToString();
}
dr.EndEdit();
SaveChanges();
return 1;
}
return 0;
}
[DataObjectMethod(DataObjectMethodType.Delete)]
public virtual int Delete(int Original_ItemID)
...{
DataRow[] rows = Table.Select(String.Format("ItemID={0}", Original_ItemID));
if (rows.Length > 0)
...{
Table.Rows.Remove(rows[0]);
SaveChanges();
return 1;
}
return 0;
}
protected virtual void LoadData()
...{
if (CanReadStream)
...{
_ds.ReadXml(XmlStream, XmlReadMode.IgnoreSchema);
}
}
protected virtual void SaveChanges()
...{
DataSet.AcceptChanges();
if (CanWriteStream)
...{
XmlStream.Flush();
DataSet.WriteXml(XmlStream, XmlWriteMode.IgnoreSchema);
}
else
...{
throw new ApplicationException("不能写入Xml,检查是否为写保护");
}
}
}
public class TodoXmlDataObjectFromFile : TodoXmlDataObject
...{
private Stream _stream;
private string _xmlPath;
private string _rootPath;
private string _xsdfile;
public TodoXmlDataObjectFromFile()
...{ }
public TodoXmlDataObjectFromFile(string rootPath, string xsdPath, string xmlPath)
...{
_rootPath = rootPath;
_xmlPath = xmlPath;
_xsdfile = xsdPath;
}
private string XmlFile
...{
get ...{ return Path.Combine(RootPath, _xmlPath); }
}
protected override string RootPath
...{
get
...{
if (_rootPath != null)
...{
return _rootPath;
}
else if (HttpContext.Current != null)
...{
return HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath);
}
else
...{
throw new ApplicationException("找不到应用程序的根目录");
}
}
}
protected override string XsdFile
...{
get ...{ return Path.Combine(RootPath, _xsdfile); }
}
protected override bool CanReadStream
...{
get ...{ return File.Exists(XmlFile); }
}
protected override Stream XmlStream
...{
get
...{
if (_stream == null)
...{
_stream = new FileStream(XmlFile, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
}
return _stream;
}
}
protected override void LoadData()
...{
XmlStream.Seek(0, SeekOrigin.Begin);
base.LoadData();
}
protected override void SaveChanges()
...{
XmlStream.Position = 0;
XmlStream.SetLength(0);
base.SaveChanges();
XmlStream.Flush();
}
}
public class TodoXmlDataObjectFromSession : TodoXmlDataObjectFromFile
...{
private string _sessionkey;
public TodoXmlDataObjectFromSession()
...{ }
public TodoXmlDataObjectFromSession(string sessionKey)
...{
_sessionkey = sessionKey;
}
private string SessionKey
...{
get ...{ return _sessionkey; }
}
protected override Stream XmlStream
...{
get
...{
if (HttpContext.Current != null)
...{
Stream sessionStream = HttpContext.Current.Session[SessionKey] as Stream;
if (sessionStream == null)
...{
if (CanReadStream && base.XmlStream != null)
...{
Stream baseStream = base.XmlStream;
sessionStream = new MemoryStream((int)baseStream.Length);
byte[] data = new byte[baseStream.Length];
baseStream.Read(data, 0, (int)baseStream.Length);
sessionStream.Write(data, 0, data.Length);
sessionStream.Seek(0, SeekOrigin.Begin);
}
else
...{
sessionStream = new MemoryStream(256);
}
HttpContext.Current.Session[SessionKey] = sessionStream;
}
return sessionStream;
}
throw new ApplicationException("不能从Session中加载xml文档");
}
}
}
}
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.IO;
using System.Web;
using System.Collections;
namespace Beasyer.Lib
... {
[DataObject(true)]
public abstract class TodoXmlDataObject
...{
private DataSet _ds;
private DataSet DataSet
...{
get
...{
if (_ds == null)
...{
_ds = new DataSet();
_ds.ReadXmlSchema(XsdFile);
LoadData();
}
return _ds;
}
}
private DataTable Table
...{
get ...{ return DataSet.Tables[0]; }
}
protected abstract string RootPath
...{
get;
}
protected abstract bool CanReadStream
...{
get;
}
protected virtual bool CanWriteStream
...{
get ...{ return true; }
}
protected abstract Stream XmlStream
...{
get;
}
protected abstract string XsdFile
...{
get;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataView Select(string sortkey)
...{
Table.DefaultView.Sort = sortkey;
return Table.DefaultView;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataView Select()
...{
return Table.DefaultView;
}
[DataObjectMethod(DataObjectMethodType.Insert)]
public int Insert(Hashtable ht)
...{
DataRow dr = Table.NewRow();
foreach (DictionaryEntry de in ht)
...{
dr[de.Key.ToString()] = de.Value.ToString();
}
Table.Rows.Add(dr);
SaveChanges();
return 1;
}
[DataObjectMethod(DataObjectMethodType.Update)]
public virtual int Update(Hashtable ht, int Original_ItemID)
...{
DataRow[] rows = Table.Select(String.Format("ItemID={0}", Original_ItemID));
if (rows.Length > 0)
...{
DataRow dr = rows[0];
dr.BeginEdit();
foreach (DictionaryEntry de in ht)
...{
dr[de.Key.ToString()] = de.Value.ToString();
}
dr.EndEdit();
SaveChanges();
return 1;
}
return 0;
}
[DataObjectMethod(DataObjectMethodType.Delete)]
public virtual int Delete(int Original_ItemID)
...{
DataRow[] rows = Table.Select(String.Format("ItemID={0}", Original_ItemID));
if (rows.Length > 0)
...{
Table.Rows.Remove(rows[0]);
SaveChanges();
return 1;
}
return 0;
}
protected virtual void LoadData()
...{
if (CanReadStream)
...{
_ds.ReadXml(XmlStream, XmlReadMode.IgnoreSchema);
}
}
protected virtual void SaveChanges()
...{
DataSet.AcceptChanges();
if (CanWriteStream)
...{
XmlStream.Flush();
DataSet.WriteXml(XmlStream, XmlWriteMode.IgnoreSchema);
}
else
...{
throw new ApplicationException("不能写入Xml,检查是否为写保护");
}
}
}
public class TodoXmlDataObjectFromFile : TodoXmlDataObject
...{
private Stream _stream;
private string _xmlPath;
private string _rootPath;
private string _xsdfile;
public TodoXmlDataObjectFromFile()
...{ }
public TodoXmlDataObjectFromFile(string rootPath, string xsdPath, string xmlPath)
...{
_rootPath = rootPath;
_xmlPath = xmlPath;
_xsdfile = xsdPath;
}
private string XmlFile
...{
get ...{ return Path.Combine(RootPath, _xmlPath); }
}
protected override string RootPath
...{
get
...{
if (_rootPath != null)
...{
return _rootPath;
}
else if (HttpContext.Current != null)
...{
return HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath);
}
else
...{
throw new ApplicationException("找不到应用程序的根目录");
}
}
}
protected override string XsdFile
...{
get ...{ return Path.Combine(RootPath, _xsdfile); }
}
protected override bool CanReadStream
...{
get ...{ return File.Exists(XmlFile); }
}
protected override Stream XmlStream
...{
get
...{
if (_stream == null)
...{
_stream = new FileStream(XmlFile, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
}
return _stream;
}
}
protected override void LoadData()
...{
XmlStream.Seek(0, SeekOrigin.Begin);
base.LoadData();
}
protected override void SaveChanges()
...{
XmlStream.Position = 0;
XmlStream.SetLength(0);
base.SaveChanges();
XmlStream.Flush();
}
}
public class TodoXmlDataObjectFromSession : TodoXmlDataObjectFromFile
...{
private string _sessionkey;
public TodoXmlDataObjectFromSession()
...{ }
public TodoXmlDataObjectFromSession(string sessionKey)
...{
_sessionkey = sessionKey;
}
private string SessionKey
...{
get ...{ return _sessionkey; }
}
protected override Stream XmlStream
...{
get
...{
if (HttpContext.Current != null)
...{
Stream sessionStream = HttpContext.Current.Session[SessionKey] as Stream;
if (sessionStream == null)
...{
if (CanReadStream && base.XmlStream != null)
...{
Stream baseStream = base.XmlStream;
sessionStream = new MemoryStream((int)baseStream.Length);
byte[] data = new byte[baseStream.Length];
baseStream.Read(data, 0, (int)baseStream.Length);
sessionStream.Write(data, 0, data.Length);
sessionStream.Seek(0, SeekOrigin.Begin);
}
else
...{
sessionStream = new MemoryStream(256);
}
HttpContext.Current.Session[SessionKey] = sessionStream;
}
return sessionStream;
}
throw new ApplicationException("不能从Session中加载xml文档");
}
}
}
}