新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 关于 XML 的一般性技术讨论,提供 XML入门资料 和 XML教程
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML基础 』 → 通过DataSet操作XML的类 [推荐] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5161 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 通过DataSet操作XML的类 [推荐] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     belinda_pjm 美女呀,离线,快来找我吧!双子座1987-6-1
      
      
      等级:大二期末(Java考了96分!)
      文章:79
      积分:417
      门派:XML.ORG.CN
      注册:2008/4/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给belinda_pjm发送一个短消息 把belinda_pjm加入好友 查看belinda_pjm的个人资料 搜索belinda_pjm在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看belinda_pjm的博客楼主
    发贴心情 通过DataSet操作XML的类 [推荐]

    public class OperateXmlByDataSet {
        public OperateXmlByDataSet() {
            //
            // TODO: Add constructor logic here
            //
        }

        #region GetDataSetByXml
        /// <summary>
        /// 读取xml直接返回DataSet
        /// </summary>
        /// <param name="strXmlPath">xml文件相对路径</param>
        /// <returns></returns>
        public static DataSet GetDataSetByXml( string strXmlPath ) {
            try {
                Debug.Assert(false);
                DataSet ds = new DataSet();
                ds.ReadXml( GetXmlFullPath( strXmlPath ) );
                if( ds.Tables.Count > 0 ) {
                    return ds;
                }
                return null;
            } catch( Exception e ) {
                return null;

            }     }
        #endregion

        #region GetDataViewByXml
        /// <summary>
        /// 读取Xml返回一个经排序或筛选后的DataView
        /// </summary>
        /// <param name="strXmlPath"></param>
        /// <param name="strWhere">筛选条件,如:"name = 'belinda'"</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 e ) {
                return null;
            }     }
        #endregion

        #region WriteXmlByDataSet
        /// <summary>
        /// 向Xml文件插入一行数据
        /// </summary>
        /// <param name="Columns">要插入行的列名数组,如:string[] Columns = {"name","age"};</param>
        /// <param name="ColumnValue">要插入行每列的值数组,如:string[] ColumnValue={"belinda","21"};</param>
        /// <param name="strXmlPath">xml文件相对路径</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 dr = dt.NewRow();
                //循环给一行中的各个列赋值
                for( int i = 0; i < Columns.Length; i++ ) {
                    dr[ Columns[ i ] ] = ColumnValue[ i ];
                }
                dt.Rows.Add( dr );
                dt.AcceptChanges();
                ds.AcceptChanges();
                ds.WriteXml( GetXmlFullPath( strXmlPath ) );
                return true;
            } catch( Exception e ) {
                return false;
            }     }
        #endregion

        #region UpdateXmlRow
        ///<summary>
        /// 更新符合条件的一条Xml记录
        ///</summary>
        /// <param name="strXmlPath">xml文件相对路径</param>
        /// <param name="Columns">列名数组</param>
        /// <param name="ColumnsValue">列值数组</param>
        /// <param name="strWhereColumnName">条件列名</param>
        /// <param name="strWhereColumnValue">条件列值</param>
        ///<returns></returns>

        public static bool UpdateXmlRow( string strXmlPath, string[] Columns, string[] ColumnsValue, 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 ] ] = ColumnsValue[ i ];
                            }
                            //更新DataSet
                            ds.AcceptChanges();
                            //重新写入XML文件
                            ds.WriteXml( GetXmlFullPath( strXmlPath ) );
                            return false;
                        }
                    }
                }
                return false;
            } catch( Exception e ) {
                return false;
            }
        }
        #endregion

        #region DeleteXmlRowByIndex
        /// <summary>
        /// 通过删除DataSet中iDeleteRow这一行,然后重写Xml以实现删除指定行
        /// </summary>
        /// <param name="strXmlPath">xml文件相对路径</param>
        /// <param name="iDeleteRow">要删除的行在DataSet中的Index值</param>
        /// <returns></returns>
        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 e ) {
                return false;
            }
        }
        #endregion

        #region DeleteXmlRows
        /// <summary>
        ///
        /// </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();
                                }
                            }
                        }
                    }
                }
                return true;
            } catch( Exception e ) {
                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 e ) {
                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

    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    xml.xslt

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/24 14:31:00
     
     belinda_pjm 美女呀,离线,快来找我吧!双子座1987-6-1
      
      
      等级:大二期末(Java考了96分!)
      文章:79
      积分:417
      门派:XML.ORG.CN
      注册:2008/4/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给belinda_pjm发送一个短消息 把belinda_pjm加入好友 查看belinda_pjm的个人资料 搜索belinda_pjm在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看belinda_pjm的博客2
    发贴心情 
    不好意思刚刚忘记把xml 和 xsd文件贴出来
    xsd文件
    <xs:schema id="job" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
    attributeFormDefault="qualified" elementFormDefault="qualified">
      <xs:element name="job" msdata:IsDataSet="true" msdata:Locale="zh-CN" msdata:EnforceConstaints="False">
        <xs:complexType>
          <xs:choice maxOccurs ="unbounded">
            <xs:element name="jobDB">
              <xs:complexType>
                <xs:sequence>
                  <!-- 这里开始定义各列的类型-->
                  <xs:element name="id" type="xs:int" minOccurs="0" msdata:AutoIncrement="true" msdata:AutoIncrementStep="1"
                  msdata:AutoIncrementSeed="1" />              <!-- AutoIncrement="true" AutoIncrementStep="1" AutoIncrementSeed="1" 自动增长值每次增长1 -->
                  <xs:element name="name" type="xs:string" minOccurs="0" />
                  <xs:element name="peopleNum" type="xs:string" minOccurs="0" />
                  <xs:element name="description" type="xs:string" minOccurs="0" />
                  <xs:element name="require" type="xs:string" minOccurs="0" />
                  <xs:element name="address" type="xs:string" minOccurs="0" />
                  <xs:element name="deadLine" type="xs:string" minOccurs="0" />
                  <xs:element name="IsMarried" type="xs:boolean" minOccurs="0" />
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>

    ----------------------------------------------
    xml.xslt

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/24 15:01:00
     
     belinda_pjm 美女呀,离线,快来找我吧!双子座1987-6-1
      
      
      等级:大二期末(Java考了96分!)
      文章:79
      积分:417
      门派:XML.ORG.CN
      注册:2008/4/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给belinda_pjm发送一个短消息 把belinda_pjm加入好友 查看belinda_pjm的个人资料 搜索belinda_pjm在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看belinda_pjm的博客3
    发贴心情 
    xml文件
    <?xml version="1.0" standalone="yes"?>
    <job>
      <jobDB>
        <id>3</id>
        <name>belinda</name>
        <peopleNum>3</peopleNum>
        <description>开发C/S结构程序</description>
        <require>asp.net,xml,xslt</require>
        <address>湖南</address>
        <deadLine>2008-4-24</deadLine>
        <IsMarried>false</IsMarried>
      </jobDB>
    </job>

    ----------------------------------------------
    xml.xslt

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/24 15:02:00
     
     visnweb 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:16
      积分:119
      门派:W3CHINA.ORG
      注册:2008/2/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给visnweb发送一个短消息 把visnweb加入好友 查看visnweb的个人资料 搜索visnweb在『 XML基础 』的所有贴子 访问visnweb的主页 引用回复这个贴子 回复这个贴子 查看visnweb的博客4
    发贴心情 
    收藏了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/24 21:58:00
     
     belinda_pjm 美女呀,离线,快来找我吧!双子座1987-6-1
      
      
      等级:大二期末(Java考了96分!)
      文章:79
      积分:417
      门派:XML.ORG.CN
      注册:2008/4/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给belinda_pjm发送一个短消息 把belinda_pjm加入好友 查看belinda_pjm的个人资料 搜索belinda_pjm在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看belinda_pjm的博客5
    发贴心情 
    更改1:在UpdataXmlRow方法中这句代码 < ds.Tables[ 0 ].Rows[ i ][ Columns[ j ] ] = ColumnsValue[ i ];>更改为: ds.Tables[ 0 ].Rows[ i ][ Columns[ j ] ] = ColumnsValue[ j ];

    更改2:DeleteXmlRows方法中在return true;上两行加这句代码:ds.WriteXml( GetXmlFullPath( strXmlPath ) );
    不好意思!

    ----------------------------------------------
    xml.xslt

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/25 14:26:00
     
     GoogleAdSense双子座1987-6-1
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML基础 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/12/27 17:27:46

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    109.375ms