日历归档 |
|
<< < 2024 - 12 > >> | Su | Mo | Tu | We | Th | Fr | Sa | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
|
|
|
About Me |
|
|
ZhangSichu |
|
Male |
|
32 |
|
ZhangSichu@gmail.com |
|
ZhangSichu@hotmail.com |
|
ZhangSichu.com |
|
weibo.com/zhangsichu |
|
|
|
个人推荐 |
|
|
|
|
分类归档 |
|
|
|
|
My Friends |
|
|
|
|
让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
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(); } } } }
File: 本文实例代码
|
|
|
|
|
|