There can be no Triumph without Loss,No Victory without Suffering,No Freedom without Sacrifice.
All you have to decide is what to do with the time that is given to you.
Get busy Living, or Get busy Dying?
  首页 | 留言给我 | 订阅 Rss | CLI | 黄白之恋 Posts:158   Hits: 5544938    Comments: 173    
 日历归档
<<  <  2024 - 11  >  >>
SuMoTuWeThFrSa
     12
3456789
10111213141516
17181920212223
24252627282930
 About Me
 Name: ZhangSichu
 Sex: Male
 Age: 32
 Email: ZhangSichu@gmail.com
 MSN: ZhangSichu@hotmail.com
 Home: ZhangSichu.com
 WeiBo: weibo.com/zhangsichu
 个人推荐
 分类归档
  ·C++/C(5)  RSS
  ·软件工程(1)  RSS
  ·杂事/随感(26)  RSS
  ·.Net/Java(30)  RSS
  ·面向对象程序设计(5)  RSS
  ·汇编/破解(0)  RSS
  ·平面设计(3)  RSS
  ·SQL(5)  RSS
  ·COM/COM+(2)  RSS
  ·Web开发(81)  RSS
 My Friends
Back Forward Refresh Home 2024年11月22日 星期五 RSS CLI Mine Sweeper. In Javascript.

  让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: 本文实例代码
  Posted @ 5/20/2006 12:49:31 PM | Hits (38838) | Comment (0

  Post Comment
标题 *
作者 *
密码 记住我
评论 *
    


Stable in Firefox 1.5 2.0Stable in IE6 IE7Stable in MozillaStable in Netscape
ZhangSichu.com V0.1.7507
Powered By ZhangSichu
Copyright © ZhangSichu
Download ZhangSichu.com source code. Download source code