以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML基础 』  (http://bbs.xml.org.cn/list.asp?boardid=1)
----  通过DataSet操作XML的类 [推荐]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=1&rootid=&id=61784)


--  作者:belinda_pjm
--  发布时间:4/24/2008 2:31:00 PM

--  通过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

}


--  作者:belinda_pjm
--  发布时间:4/24/2008 3:01:00 PM

--  
不好意思刚刚忘记把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>
--  作者:belinda_pjm
--  发布时间:4/24/2008 3:02:00 PM

--  
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>
--  作者:visnweb
--  发布时间:4/24/2008 9:58:00 PM

--  
收藏了
--  作者:belinda_pjm
--  发布时间:4/25/2008 2:26:00 PM

--  
更改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 ) );
不好意思!


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
93.750ms