让DataTable也ReadXml
在.Net DataSet
这个类中,提供了 DataSet.ReadXml
和 DataSet.ReadXmlSchema
这两个强大的方法。可以非常灵活的用 Xml 信息来填充一个 DataSet
。.Net 支持用 Xml 文件,XmlRead, TextRead,Stream 来填充 DataSet。在填充的时候,可以用 XmlReadMode
来指定读取 Xml 信息的方式,从而确定填充的方式。其中的 XmlReadMode.ReadSchema
方式,可以确保读入数据的Schema正确。DiffGram
指定用 DiffGram
方式读取 DiffGram
格式的Xml来填充数据,Fragment
可以用 Sql for xml auto 的查询结果来填充 Xml。
上面这些强大的功能都是在 DataSet
上提供的。可能一般的应用程序,只需要和一个 DataTable
时时交互就可以了。应用程序运行时,DataTable
在内存中,让一个 DataTable
和一个Xml时时交互。就是本文实例代码实现的功能。就是好像让DataTable
也ReadXml WriteXml
了。
下面是.Net提供的DataSet.ReadXml
1
2
3
4
5
DataSet dataSet = new DataSet();
dataSet.ReadXmlSchema("Data.xsd");
dataSet.ReadXml("Data.xml",XmlReadMode.ReadSchema);
this.gridMain.DataSource = dataSet;
dataSet.WriteXml("Out.xml", XmlWriteMode.WriteSchema);
下面是DataTable ReadXml
1
2
XmlHelper helper = new XmlHelper("Data.xml", "/DailyReportApplication/FieldItem", "/DailyReportApplication/FieldInfo", 0);
this.gridMain.DataSource = helper.GetFieldTable();
XmlHelper中有一个GetFieldTable()
这个方法返回 Read出来的DataTable。Xml的构造方法中传入了4个参数: 1.Xml文件 2.Xml 中的Schema定义区 3.Xml中的的数据定义区 4.DataTable中的PrimaryKey列 PrimaryKey列用来定位一个指定的DataRow
。XmlHelper
中的WriteFieldTable()
WriteSingleField()
把DataTable
写到 Xml中。其中也可以用XPath来唯一定位一个元素。
XmlHelper中InitializeFieldTable()
方法 填充DataTable Schema
1
2
3
4
5
6
7
8
9
private void InitializeFieldTable()
{
this._fieldTable = new DataTable();
XmlNodeList nodes = this._document.SelectNodes(this._fieldItem);
foreach(XmlNode node in nodes)
{
this._fieldTable.Columns.Add(node.ChildNodes.Item(0).InnerText, System.Type.GetType(node.ChildNodes.Item(1).InnerText));
}
}
XmlHelper
中 FillFieldTable()
方法 填充 DataTable()
1
2
3
4
5
6
7
8
9
10
11
12
13
private void FillFieldTable()
{
XmlNodeList nodes = this._document.SelectNodes(this._fieldInfo);
foreach(XmlNode node in nodes)
{
DataRow row = this._fieldTable.NewRow();
for(int i=0;i<node.ChildNodes.Count;i++)
{
row[i] = node.ChildNodes.Item(i).InnerText;
}
this._fieldTable.Rows.Add(row);
}
}
最后写入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
internal void WriteSingleField(int index)
{
if(this._fieldTable == null)
return;
if(this._fieldTable.Rows.Count <= index)
return;
XmlNodeList nodes = this._document.SelectNodes(this._fieldInfo + / + this._fieldTable.Columns[this._uniqueColumnIndex].ColumnName);
for(int i = 0;i<this._fieldTable.Rows.Count;i++)
{
if(nodes[i].InnerText.ToString() == this._fieldTable.Rows[i][this._uniqueColumnIndex].ToString())
{
foreach(XmlNode node in nodes[i].ParentNode.ChildNodes)
{
node.InnerText = this._fieldTable.Rows[i][node.Name].ToString();
}
}
}
}