一个通过DataSet操作XML的类(转载)

转载 2008年09月28日 15:26:00

using System;
using System.Data;
using System.Xml;

//***************************************
// 作者: ∮明天去要饭
// QICQ: 305725744
// .Net群: 6370988
// http://blog.csdn.net/kgdiwss
//***************************************

namespace DataSet2Xml.Component
{
/// <summary>
/// OperateXmlByDataSet 的摘要说明。
/// </summary>
public class OperateXmlByDataSet
{
   public OperateXmlByDataSet()
   {
    //
    // TODO: 在此处添加构造函数逻辑
    //
   }
  
   #region GetDataSetByXml
   /// <summary>
   /// 读取xml直接返回DataSet
   /// </summary>
   /// <param name="strXmlPath">xml文件相对路径</param>
   /// <returns></returns>
   public static DataSet GetDataSetByXml(string strXmlPath)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     if(ds.Tables.Count > 0)
     {
      return ds;
     }
     return null;
    }
    catch(Exception)
    {
     return null;
    }
   }
   #endregion

   #region GetDataViewByXml
   /// <summary>
   /// 读取Xml返回一个经排序或筛选后的DataView
   /// </summary>
   /// <param name="strXmlPath"></param>
   /// <param name="strWhere">筛选条件,如:"name = 'kgdiwss'"</param>
   /// <param name="strSort">排序条件,如:"Id desc"</param>
   /// <returns></returns>
   public static DataView GetDataViewByXml(string strXmlPath,string strWhere,string strSort)
   {
    try
    {
     DataSet ds = new DataSet();   
     ds.ReadXml(GetXmlFullPath(strXmlPath));   
     DataView dv = new DataView(ds.Tables[0]);
     if(strSort != null)
     {
      dv.Sort = strSort;
     }
     if(strWhere != null)
     {
      dv.RowFilter = strWhere;   
     }
     return dv;
    }
    catch(Exception)
    {
     return null;
    }
   }
   #endregion

   #region WriteXmlByDataSet
   /// <summary>
   /// 向Xml文件插入一行数据
   /// </summary>
   /// <param name="strXmlPath">xml文件相对路径</param>
   /// <param name="Columns">要插入行的列名数组,如:string[] Columns = {"name","IsMarried"};</param>
   /// <param name="ColumnValue">要插入行每列的值数组,如:string[] ColumnValue={"明天去要饭","false"};</param>
   /// <returns>成功返回true,否则返回false</returns>
   public static bool WriteXmlByDataSet(string strXmlPath,string[] Columns,string[] ColumnValue)
   {
    try
    {     
     //根据传入的XML路径得到.XSD的路径,两个文件放在同一个目录下
     string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(".")) + ".xsd";
    
     DataSet ds = new DataSet();
     //读xml架构,关系到列的数据类型
     ds.ReadXmlSchema(GetXmlFullPath(strXsdPath));
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     DataTable dt = ds.Tables[0];
     //在原来的表格基础上创建新行
     DataRow newRow = dt.NewRow();

     //循环给一行中的各个列赋值
     for(int i=0; i< Columns.Length; i++)
     {
      newRow[Columns[i]] = ColumnValue[i];
     }
     dt.Rows.Add(newRow);
     dt.AcceptChanges();
     ds.AcceptChanges();

     ds.WriteXml(GetXmlFullPath(strXmlPath));
     return true;
    }
    catch(Exception)
    {
     return false;
    }
   }
   #endregion  

   #region UpdateXmlRow
   /// <summary>
   /// 更行符合条件的一条Xml记录
   /// </summary>
   /// <param name="strXmlPath">XML文件路径</param>
   /// <param name="Columns">列名数组</param>
   /// <param name="ColumnValue">列值数组</param>
   /// <param name="strWhereColumnName">条件列名</param>
   /// <param name="strWhereColumnValue">条件列值</param>
   /// <returns></returns>
   public static bool UpdateXmlRow(string strXmlPath,string[] Columns,string[] ColumnValue,string strWhereColumnName,string strWhereColumnValue)
   {
    try
    {       
     string strXsdPath = strXmlPath.Substring(0,strXmlPath.IndexOf(".")) + ".xsd";
    
     DataSet ds = new DataSet();
     //读xml架构,关系到列的数据类型
     ds.ReadXmlSchema(GetXmlFullPath(strXsdPath));
     ds.ReadXml(GetXmlFullPath(strXmlPath));

     //先判断行数
     if(ds.Tables[0].Rows.Count > 0)
     {     
      for(int i=0; i< ds.Tables[0].Rows.Count; i++)
      {
       //如果当前记录为符合Where条件的记录
       if(ds.Tables[0].Rows[i][strWhereColumnName].ToString().Trim().Equals(strWhereColumnValue))
       {
        //循环给找到行的各列赋新值
        for(int j=0; j < Columns.Length; j++)
        {               
         ds.Tables[0].Rows[i][Columns[j]] = ColumnValue[j];        
        }
        //更新DataSet
        ds.AcceptChanges();
        //重新写入XML文件
        ds.WriteXml(GetXmlFullPath(strXmlPath));
        return true;
       }
      }     
     
     }     
     return false;
    }
    catch(Exception)
    {
     return false;
    }
   }
   #endregion  

   #region DeleteXmlRowByIndex
   /// <summary>
   /// 通过删除DataSet中iDeleteRow这一行,然后重写Xml以实现删除指定行
   /// </summary>
   /// <param name="strXmlPath"></param>
   /// <param name="iDeleteRow">要删除的行在DataSet中的Index值</param>
   public static bool DeleteXmlRowByIndex(string strXmlPath,int iDeleteRow)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     if(ds.Tables[0].Rows.Count > 0)
     {
      //删除符号条件的行
      ds.Tables[0].Rows[iDeleteRow].Delete();
     }
     ds.WriteXml(GetXmlFullPath(strXmlPath));
     return true;
    }
    catch(Exception)
    {
     return false;
    }   
   }
   #endregion

   #region DeleteXmlRows
   /// <summary>
   /// 删除strColumn列中值为ColumnValue的行
   /// </summary>
   /// <param name="strXmlPath">xml相对路径</param>
   /// <param name="strColumn">列名</param>
   /// <param name="ColumnValue">strColumn列中值为ColumnValue的行均会被删除</param>
   /// <returns></returns>
   public static bool DeleteXmlRows(string strXmlPath,string strColumn,string[] ColumnValue)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));

     //先判断行数
     if(ds.Tables[0].Rows.Count > 0)
     {
      //判断行多还是删除的值多,多的for循环放在里面
      if(ColumnValue.Length > ds.Tables[0].Rows.Count)
      {
       for(int i=0; i < ds.Tables[0].Rows.Count; i++)
       {       
        for(int j=0; j < ColumnValue.Length; j++)
        {      
         if(ds.Tables[0].Rows[i][strColumn].ToString().Trim().Equals(ColumnValue[j]))
         {
          ds.Tables[0].Rows[i].Delete();
         }
        }
       }
      }
      else
      {
       for(int j=0; j < ColumnValue.Length; j++)
       {       
        for(int i=0; i < ds.Tables[0].Rows.Count; i++)
        {         
         if(ds.Tables[0].Rows[i][strColumn].ToString().Trim().Equals(ColumnValue[j]))
         {
          ds.Tables[0].Rows[i].Delete();
         }
        }
       }      
      }  
      ds.WriteXml(GetXmlFullPath(strXmlPath));
     }    
     return true;  
    }
    catch(Exception)
    {
     return false;
    }   
   }
   #endregion
  
   #region DeleteXmlAllRows
   /// <summary>
   /// 删除所有行
   /// </summary>
   /// <param name="strXmlPath">XML路径</param>
   /// <returns></returns>
   public static bool DeleteXmlAllRows(string strXmlPath)
   {
    try
    {
     DataSet ds = new DataSet();
     ds.ReadXml(GetXmlFullPath(strXmlPath));
     //如果记录条数大于0
     if(ds.Tables[0].Rows.Count > 0)
     {
      //移除所有记录
      ds.Tables[0].Rows.Clear();
     }
     //重新写入,这时XML文件中就只剩根节点了
     ds.WriteXml(GetXmlFullPath(strXmlPath));    
     return true;
    }
    catch(Exception)
    {
     return false;
    }  
   }
   #endregion

   #region GetXmlFullPath
   /// <summary>
   /// 返回完整路径
   /// </summary>
   /// <param name="strPath">Xml的路径</param>
   /// <returns></returns>
   public static string GetXmlFullPath(string strPath)
   {  
    if(strPath.IndexOf(":") > 0)
    {
     return strPath;
    }
    else
    {
     return System.Web.HttpContext.Current.Server.MapPath(strPath);
    }
   }
   #endregion
}
}

一个通过DataSet操作XML的类

 这段时间写的项目每次都要用到XML保存一些配置,而每次操作XML都觉得挺麻烦,没有数据库那么顺手。后来发现用DataSet操作XML很方便,而且灵活性比较好,于是写了一个操作XML的类,用来应付一般...
  • jelink
  • jelink
  • 2006年09月01日 13:45
  • 697

一个通过DataSet操作XML的类

这段时间写的项目每次都要用到XML保存一些配置,而每次操作XML都觉得挺麻烦,没有数据库那么顺手。后来发现用DataSet操作XML很方便,而且灵活性比较好,于是写了一个操作XML的类,用来应付一般的...
  • xuezj508
  • xuezj508
  • 2007年06月06日 16:07
  • 434

通过DataSet操作XML

以下是通过DataSet操作XML的类:using System;using System.Collections;using System.ComponentModel;using Syste...
  • tenghoo
  • tenghoo
  • 2006年09月18日 17:52
  • 226

通过DataSet 操作xml

using System; using System.Collections; using System.ComponentModel; using System.Data; using Sy...
  • ahuthfp19
  • ahuthfp19
  • 2011年11月04日 08:26
  • 154

一个通过DataSet操作XML的类(原创)

  这段时间写的项目每次都要用到XML保存一些配置,而每次操作XML都觉得挺麻烦,没有数据库那么顺手。后来发现用DataSet操作XML很方便,而且灵活性比较好,于是写了一个操作XML的类,用来应付一...
  • kgdiwss
  • kgdiwss
  • 2005年09月07日 20:47
  • 1561

.net实例:vb.net DataSet 操作xml文件

      说明:在微软ado.net 2.0版本中,还不能把整个xml文件映射到DataSet集中。也就是说,XML装入到DataSet时,总是能成功,但是在修改了数据保存时,DataSet始终按默...
  • yiyong0418
  • yiyong0418
  • 2008年12月13日 10:15
  • 1732

wcf传输Dataset大数据量(转)

http://www.th7.cn/Program/net/201309/148486.shtml   由于WCF不能传输DataTable(不能序列化),所以更多项目中都会使用DataSet作为...
  • zunguitiancheng
  • zunguitiancheng
  • 2014年03月29日 12:13
  • 759

c#操作xml文档的通用类

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu...
  • zhujunxxxxx
  • zhujunxxxxx
  • 2014年01月19日 13:22
  • 2078

通过DataSet读取XML的效率问题

一直以来读取xml都是通过DataSet的ReadXML方法来解决,其他属性也都没有使用。在数据量小的时候倒也相安无事,直到今天读取一个20M的XML流才发现实在太影响效率了。    默认情况下,Re...
  • jelink
  • jelink
  • 2006年09月01日 14:01
  • 745

DataSet里的数据写入XML文件

//连接字符串string strConn = @"Data Source=192.168.1.9;password=sa;user id= sa;Initial Catalog =cityfamil...
  • greenerycn
  • greenerycn
  • 2007年05月09日 19:55
  • 1156
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个通过DataSet操作XML的类(转载)
举报原因:
原因补充:

(最多只允许输入30个字)