让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();
      }
    }
  }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值