在.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
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
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
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()
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);
}
}
最后写入数据
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();
}
}
}
}
让DataTable也ReadXml
最新推荐文章于 2024-03-01 09:15:52 发布