配置文件读写方法

using System;
using System.Collections.Generic;
using System.Data;
using System.Xml;

namespace Lib.Text
{
///
/// 常用 XML配置文件读写方法
///
public class XMLSetFile
{
///
/// 写入自定义节点的键值对
///
///
/// 键
/// 值
/// XML文件路径
/// bool
public static bool SetSectionValue(string Section, string Key, string Value, string FilePath)
{
try
{
if (IsNum(Section))
{ throw new Exception(“Section不能以数字开头”); }
if (IsNum(Key))
{ throw new Exception(“Key不能以数字开头”); }
if (IsSpecialChar(Key))
{ throw new Exception(“Key不允许包含特殊字符”); }
XmlDocument doc = Get_RootDoc(FilePath);
//4、给文档添加根节点
XmlElement config = doc.DocumentElement;
XmlElement xe= config[“Section”];
XmlElement Sec = xe[Section];
if (Sec == null)
{
Sec = doc.CreateElement(Section);
xe.AppendChild(Sec);
}
XmlNode nodeparams2 = Sec.SelectSingleNode(Key);//子节点
if (nodeparams2 == null)
{
XmlElement name = doc.CreateElement(Key);
name.InnerText = Value;
Sec.AppendChild(name);
}
else
{

                XmlNodeList nodelist = nodeparams2.ChildNodes;
                if (nodelist != null)
                {
                    XmlNode ID = nodelist[0];
                    if (ID != null)
                    { ID.InnerText = Value; }
                    else
                    { nodeparams2.InnerText = Value; }
                }
            }
            doc.Save(FilePath);
            return true;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 写入自定义节点的键值对
    /// </summary>
    /// <param name="Section">节点</param>
    /// <param name="dic">字典</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>bool</returns>
    public static bool SetSectionValue(string Section, Dictionary<string, string> dic, string FilePath)
    {
        try
        {
            if (string.IsNullOrEmpty(Section))
            { throw new Exception("Section不能为空"); }
            if (IsNum(Section))
            { throw new Exception("Section不能以数字开头"); }

            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement xe = config["Section"];
            XmlElement Sec = xe[Section];
            if (Sec == null)
            {
                Sec = doc.CreateElement(Section);
                xe.AppendChild(Sec);
                foreach (var item in dic)
                {
                    if (string.IsNullOrEmpty(item.Key.ToString()))
                    { throw new Exception("Key不能为空"); }
                    if (IsNum(item.Key.ToString()))
                    { throw new Exception("Key不能以数字开头"); }
                    if (IsSpecialChar(item.Key.ToString()))
                    { throw new Exception("Key不允许包含特殊字符"); }

                    XmlElement key = doc.CreateElement(item.Key.ToString());

                    key.InnerText = item.Value;
                    Sec.AppendChild(key);
                }
            }

            else
            {
                Sec.RemoveAll();
                foreach (var item in dic)
                {
                    if (string.IsNullOrEmpty(item.Key.ToString()))
                    { throw new Exception("Key不能为空"); }
                  

                    if (IsNum(item.Key.ToString()))
                    { throw new Exception("Key不能以数字开头"); }
                    if (IsSpecialChar(item.Key.ToString()))
                    { throw new Exception("Key不允许包含特殊字符"); }

                    XmlElement key = doc.CreateElement(item.Key.ToString());
                    key.InnerText = item.Value;
                    Sec.AppendChild(key);
                }
            }
            doc.Save(FilePath);
            return true;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 读取自定义节点的键值对
    /// </summary>
    /// <param name="Section">节点</param>
    /// <param name="Key">键</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>Dictionary</returns>
    public static string GetSectionValue(string Section, string Key, string FilePath)
    {
        try
        {
            string value = string.Empty;
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement xe = config["Section"];
            XmlElement Sec = xe[Section];
            if (Sec == null)
            { return value; }
            XmlNode nodeparams2 = Sec.SelectSingleNode(Key);//子节点
            if (nodeparams2 != null)
            {
                XmlNodeList nodelist = nodeparams2.ChildNodes;
                if (nodelist != null && nodelist.Count > 0)
                {
                    XmlNode ID = nodelist[0];
                    if (ID.InnerText != null)
                        value = ID.InnerText;
                }

            }
            return value;

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 读取自定义节点的键值对
    /// </summary>
    /// <param name="Section">节点</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>Dictionary</returns>
    public static Dictionary<string, string> GetSectionValue(string Section, string FilePath)
    {
        try
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement xe = config["Section"];
        
            XmlNode nodeparams2 = xe.SelectSingleNode(Section);//子节点
            if (nodeparams2 != null)
            {
                XmlNodeList nodelist = nodeparams2.ChildNodes;
                if (nodelist != null)
                {
                    foreach (XmlNode item in nodelist)
                    {
                        if (!dic.ContainsKey(item.Name))
                            dic.Add(item.Name, item.InnerText);
                    }
                }
            }
            return dic;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 设置值
    /// </summary>
    /// <param name="Key">Key</param>
    /// <param name="Value">Value</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>bool</returns>
    public static bool SetValue(string Key, string Value, string FilePath)
    {
        try
        {
            if (string.IsNullOrEmpty(Key))
            { throw new Exception("Key不能为空"); }
          
            if (IsNum(Key))
            { throw new Exception("Key不能以数字开头"); }
            if (IsSpecialChar(Key))
            { throw new Exception("Key不允许包含特殊字符"); }
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement Set = config["Set"];
            XmlNode nodeparams2 = Set.SelectSingleNode(Key);//子节点
            if (nodeparams2 == null)
            {
                XmlElement name = doc.CreateElement(Key);
                name.InnerText = Value;
                Set.AppendChild(name);
            }
            else
            {

                XmlNodeList nodelist = nodeparams2.ChildNodes;
                if (nodelist != null)
                {
                    XmlNode ID = nodelist[0];
                    if (ID != null)
                    { ID.InnerText = Value; }
                    else
                    { nodeparams2.InnerText = Value; }


                }
            }
            doc.Save(FilePath);
            return true;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 获取值
    /// </summary>
    /// <param name="Key">Key</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>string</returns>
    public static string GetValue(string Key, string FilePath)
    {
        try
        {
            string value = string.Empty;
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement Set = config["Set"];
            XmlNode nodeparams2 = Set.SelectSingleNode(Key);//子节点
            if (nodeparams2 != null)
            {
                XmlNodeList nodelist = nodeparams2.ChildNodes;
                if (nodelist != null && nodelist.Count > 0)
                {
                    XmlNode ID = nodelist[0];
                    if (ID.InnerText != null)
                        value = ID.InnerText;
                }

            }
            return value;

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 获取字典
    /// </summary>
    /// <param name="Key">Key</param>
    /// <param name="dic">字典</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>bool</returns>
    public static bool SetDic(string Key, Dictionary<string, string> dic, string FilePath)
    {

        try
        {
            if (string.IsNullOrEmpty(Key))
            { throw new Exception("Key不能为空"); }
           

            if (IsNum(Key))
            { throw new Exception("Key不能以数字开头"); }
            if (IsSpecialChar(Key))
            { throw new Exception("Key不允许包含特殊字符"); }

            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement Dic = config["Dic"];
            XmlNode nodeparams2 = Dic.SelectSingleNode(Key);//子节点
            if (nodeparams2 == null)
            {
                XmlElement name = doc.CreateElement(Key);
                Dic.AppendChild(name);
                foreach (var item in dic)
                {
                    if (string.IsNullOrEmpty(item.Key.ToString()))
                    { throw new Exception("Key不能为空"); }
                   

                    if (IsNum(item.Key.ToString()))
                    { throw new Exception("Key不能以数字开头"); }
                    if (IsSpecialChar(item.Key.ToString()))
                    { throw new Exception("Key不允许包含特殊字符"); }
                    XmlElement key = doc.CreateElement(item.Key.ToString());
                    key.InnerText = item.Value;
                    name.AppendChild(key);
                }
            }
            else
            {
                nodeparams2.RemoveAll();
                foreach (var item in dic)
                {
                    if (string.IsNullOrEmpty(item.Key.ToString()))
                    { throw new Exception("Key不能为空"); }
                   
                    if (IsNum(item.Key.ToString()))
                    { throw new Exception("Key不能以数字开头"); }
                    if (IsSpecialChar(item.Key.ToString()))
                    { throw new Exception("Key不允许包含特殊字符"); }
                    XmlElement key = doc.CreateElement(item.Key.ToString());
                    key.InnerText = item.Value;
                    nodeparams2.AppendChild(key);
                }
            }
            doc.Save(FilePath);
            return true;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 设置字典
    /// </summary>
    /// <param name="Key">Key</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns>Dictionary</returns>
    public static Dictionary<string, string> GetDic(string Key, string FilePath)
    {
        try
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement Dic = config["Dic"];
            XmlNode nodeparams2 = Dic.SelectSingleNode(Key);//子节点
            if (nodeparams2 != null)
            {
                XmlNodeList nodelist = nodeparams2.ChildNodes;
                if (nodelist != null)
                {
                    foreach (XmlNode item in nodelist)
                    {
                        if (!dic.ContainsKey(item.Name))
                            dic.Add(item.Name, item.InnerText);
                    }
                }
            }
            return dic;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    /// <summary>
    /// 写入DataSet
    /// </summary>
    /// <param name="Key">DataSet名称</param>
    /// <param name="ds">DataSet</param>
    /// <param name="FilePath">文件路径</param>
    /// <returns></returns>
    public static bool SetDataSet(string Key, DataSet ds, string FilePath)
    {
        if (string.IsNullOrEmpty(Key))
        { throw new Exception("Key不能为空"); }
        

        if (IsNum(Key))
        { throw new Exception("Key不能以数字开头"); }
        if (IsSpecialChar(Key))
        { throw new Exception("Key不允许包含特殊字符"); }
        XmlDocument doc = Get_RootDoc(FilePath);
        //4、给文档添加根节点
        XmlElement config = doc.DocumentElement;
        XmlElement DS = config["DataSet"];
        XmlNode nodeparams2 = DS.SelectSingleNode(Key);//子节点
        if (nodeparams2 == null)
        {
            XmlElement nameds = doc.CreateElement(Key);
            DS.AppendChild(nameds);
            foreach (DataTable dt in ds.Tables)
            {
                XmlElement name_dt = doc.CreateElement("Tables");
                name_dt.SetAttribute("TableName", dt.TableName);
                nameds.AppendChild(name_dt);
                XmlNode nodeparams_dt = DS.SelectSingleNode(Key);//子节点
                //创建列 <DataColumn>
                XmlElement DataColumn = doc.CreateElement("DataColumn");
                name_dt.AppendChild(DataColumn);
                foreach (DataColumn colums in dt.Columns)
                {
                    if (string.IsNullOrEmpty(colums.ColumnName))
                    { throw new Exception("ColumnName不能为空"); }
                    if (IsNum(colums.ColumnName))
                    { throw new Exception("ColumnName不能以数字开头"); }
                    XmlElement ColumnName = doc.CreateElement(colums.ColumnName);
                    if (colums.Unique)
                    { ColumnName.SetAttribute("Unique", colums.Unique.ToString()); }
                    if (colums.AutoIncrement)
                    {
                        ColumnName.SetAttribute("AutoIncrement", colums.AutoIncrement.ToString());
                        if (colums.AutoIncrementStep > 0)
                        { ColumnName.SetAttribute("AutoIncrementStep", colums.AutoIncrementStep.ToString()); }
                        if (colums.AutoIncrementSeed > 0)
                        { ColumnName.SetAttribute("AutoIncrementSeed", colums.AutoIncrementSeed.ToString()); }
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(colums.DefaultValue.ToString()))
                        { ColumnName.SetAttribute("DefaultValue", colums.DefaultValue.ToString()); }
                    }
                    if (colums.ReadOnly)
                    { ColumnName.SetAttribute("ReadOnly", colums.ReadOnly.ToString()); }
                    ColumnName.SetAttribute("DataType", colums.DataType.ToString());
                    ColumnName.SetAttribute("Caption", colums.Caption.ToString());
                    ColumnName.InnerText = colums.ColumnName;
                    DataColumn.AppendChild(ColumnName);

                }
                foreach (DataRow row in dt.Rows)
                {
                    if (row.RowState == DataRowState.Deleted)
                    { continue; }
                    XmlElement table = doc.CreateElement("table");
                    name_dt.AppendChild(table);
                    foreach (DataColumn colums in dt.Columns)
                    {
                        if (string.IsNullOrEmpty(colums.ColumnName))
                        { throw new Exception("ColumnName不能为空"); }
                        if (IsNum(colums.ColumnName))
                        { throw new Exception("ColumnName不能以数字开头"); }
                        XmlElement c = doc.CreateElement(colums.ColumnName);
                        if (!string.IsNullOrEmpty(row[colums.ColumnName].ToString()))
                        {
                            //object ob = row[colums.ColumnName];
                            //string dfdfd = row[colums.ColumnName].ToString();
                            c.InnerText = WriteStr(colums.DataType.ToString(), row[colums.ColumnName]);
                        }
                        else
                        {
                            c.InnerText = "System.DBNull.Value";
                        }
                        //c.InnerText = row[colums.ColumnName].ToString();
                        table.AppendChild(c);
                    }
                }
            }

        }
        else
        {
            nodeparams2.RemoveAll();
            foreach (DataTable dt in ds.Tables)
            {
                XmlElement name_dt = doc.CreateElement("Tables");
                name_dt.SetAttribute("TableName", dt.TableName);

                nodeparams2.AppendChild(name_dt);
                XmlNode nodeparams_dt = DS.SelectSingleNode(Key);//子节点

                //创建列 <DataColumn>
                XmlElement DataColumn = doc.CreateElement("DataColumn");
                name_dt.AppendChild(DataColumn);


                foreach (DataColumn colums in dt.Columns)
                {
                    if (string.IsNullOrEmpty(colums.ColumnName))
                    { throw new Exception("ColumnName不能为空"); }
                    if (IsNum(colums.ColumnName))
                    { throw new Exception("ColumnName不能以数字开头"); }
                    XmlElement ColumnName = doc.CreateElement(colums.ColumnName);
                    if (colums.Unique)
                    { ColumnName.SetAttribute("Unique", colums.Unique.ToString()); }
                    if (colums.AutoIncrement)
                    {
                        ColumnName.SetAttribute("AutoIncrement", colums.AutoIncrement.ToString());
                        if (colums.AutoIncrementStep > 0)
                        { ColumnName.SetAttribute("AutoIncrementStep", colums.AutoIncrementStep.ToString()); }
                        if (colums.AutoIncrementSeed > 0)
                        { ColumnName.SetAttribute("AutoIncrementSeed", colums.AutoIncrementSeed.ToString()); }
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(colums.DefaultValue.ToString()))
                        { ColumnName.SetAttribute("DefaultValue", colums.DefaultValue.ToString()); }
                    }
                    ColumnName.SetAttribute("DataType", colums.DataType.ToString());
                    ColumnName.SetAttribute("Caption", colums.Caption.ToString());
                    ColumnName.InnerText = colums.ColumnName;
                    DataColumn.AppendChild(ColumnName);
                }
                foreach (DataRow row in dt.Rows)
                {
                    if (row.RowState == DataRowState.Deleted)
                    { continue; }
                    XmlElement table = doc.CreateElement("table");
                    name_dt.AppendChild(table);
                    foreach (DataColumn colums in dt.Columns)
                    {
                        if (string.IsNullOrEmpty(colums.ColumnName))
                        { throw new Exception("ColumnName不能为空"); }
                        if (IsNum(colums.ColumnName))
                        { throw new Exception("ColumnName不能以数字开头"); }
                        XmlElement c = doc.CreateElement(colums.ColumnName);
                        if (!string.IsNullOrEmpty(row[colums.ColumnName].ToString()))
                        {
                            c.InnerText = WriteStr(colums.DataType.ToString(), row[colums.ColumnName]).NullToString();
                        }
                        else
                        {
                            c.InnerText = "System.DBNull.Value";
                        }
                        table.AppendChild(c);
                    }
                }
            }

        }
        doc.Save(FilePath);
        return true;

    }
    /// <summary>
    /// 读取DataSet
    /// </summary>
    /// <param name="Key">DataSet名称</param>
    /// <param name="FilePath">文件路径</param>
    /// <param name="AInc">是否忽略列的AutoIncrement属性,true如果保存表有自增行,就重新获取自增的序号;false按保存的原始数据输出</param>
    /// <returns></returns>
    public static DataSet GetDataSet(string Key, string FilePath, bool AInc = true)
    {
        try
        {
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement DT = config["DataSet"];
            XmlNode nodeparams2 = DT.SelectSingleNode(Key);//子节点
            if (nodeparams2 == null)
            { return null; }



            DataSet ds = new DataSet();
            XmlNodeList Tablelist = nodeparams2.ChildNodes;


            DataColumn newColumn;
            if (nodeparams2 == null)
            {
                return null;
            }
            if (Tablelist.Count == 0)
            {
                return null;
            }
            foreach (XmlNode tableitem in Tablelist)
            {
                Dictionary<string, XmlNode> dc = new Dictionary<string, XmlNode>();
                DataTable dt = new DataTable();
                dt.TableName = tableitem.Attributes["TableName"].Value;
                // tableitem.ChildNodes.Item
                XmlNodeList DataColumnlist = tableitem["DataColumn"].ChildNodes;//子节点//tableitem.ChildNodes;
                foreach (XmlNode item in DataColumnlist)
                {

                    newColumn = new DataColumn();
                    newColumn.ColumnName = item.InnerText;
                    if (!dc.ContainsKey(item.Name))
                    { dc.Add(item.Name, item); }
                    bool AutoIncrement = false;
                    #region 列读取
                    if (item.Attributes.GetNamedItem("DataType") != null)
                    {
                        if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("DataType").Value.ToString()))
                        { newColumn.DataType = System.Type.GetType(item.Attributes.GetNamedItem("DataType").Value.ToString()); }
                    }
                    if (item.Attributes.GetNamedItem("Caption") != null)
                    {
                        if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("Caption").Value.ToString()))
                        { newColumn.Caption = item.Attributes.GetNamedItem("Caption").Value.ToString(); }
                    }
                    if (item.Attributes.GetNamedItem("Unique") != null)
                    {
                        newColumn.Unique = GetStrigToBool(item.Attributes.GetNamedItem("Unique").Value.ToString());
                    }
                    if (item.Attributes.GetNamedItem("AutoIncrement") != null && AInc)
                    {
                        AutoIncrement = GetStrigToBool(item.Attributes.GetNamedItem("AutoIncrement").Value.ToString());
                        newColumn.AutoIncrement = AutoIncrement;
                    }
                    if (AutoIncrement && AInc)
                    {
                        if (item.Attributes.GetNamedItem("AutoIncrementStep") != null)
                        {
                            if (StringToLong(item.Attributes.GetNamedItem("AutoIncrementStep").Value.ToString()) > 0)
                            {
                                newColumn.AutoIncrementStep = StringToLong(item.Attributes.GetNamedItem("AutoIncrementStep").Value.ToString());
                            }
                            if (StringToLong(item.Attributes.GetNamedItem("AutoIncrementSeed").Value.ToString()) > 0)
                            {
                                newColumn.AutoIncrementSeed = StringToLong(item.Attributes.GetNamedItem("AutoIncrementSeed").Value.ToString());
                            }
                        }
                    }
                    else
                    {
                        if (item.Attributes.GetNamedItem("DefaultValue") != null)
                        {
                            if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("DefaultValue").Value.ToString()))
                            { newColumn.DefaultValue = item.Attributes.GetNamedItem("DefaultValue").Value.ToString(); }
                        }
                    }
                    if (AInc == false)
                    {
                        if (item.Attributes.GetNamedItem("DefaultValue") != null)
                        {
                            if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("DefaultValue").Value.ToString()))
                            { newColumn.DefaultValue = item.Attributes.GetNamedItem("DefaultValue").Value.ToString(); }
                        }
                    }
                    if (!dt.Columns.Contains(newColumn.ColumnName))
                    { dt.Columns.Add(newColumn); }
                    #endregion
                }

                XmlNodeList nodelist = tableitem.SelectNodes("table");//子节点
                if (nodelist == null)
                {
                    return null;
                }
                if (nodelist.Count == 0)
                {
                    return null;
                }
                foreach (XmlNode item in nodelist)
                {
                    XmlNodeList table = item.ChildNodes;
                    DataRow row = dt.NewRow();
                    foreach (XmlNode nl in table)
                    {
                        string value = nl.InnerText.Trim();
                        XmlNode xn = dc[nl.Name];
                        if (xn != null)
                        {
                            bool AutoIncrement = false, ReadOnly = false; ;
                            string DataType = "System.String";
                            if (xn.Attributes.GetNamedItem("AutoIncrement") != null && AInc)
                            {
                                AutoIncrement = GetStrigToBool(xn.Attributes.GetNamedItem("AutoIncrement").Value.ToString());
                            }

                            if (xn.Attributes.GetNamedItem("ReadOnly") != null)
                            {
                                ReadOnly = GetStrigToBool(xn.Attributes.GetNamedItem("ReadOnly").Value.ToString());
                            }
                            if (xn.Attributes.GetNamedItem("DataType") != null)
                            {
                                DataType = xn.Attributes.GetNamedItem("DataType").Value.ToString();
                            }
                            if (!AutoIncrement && ReadOnly == false && !string.IsNullOrEmpty(value))
                            {
                                if (value == "System.DBNull.Value")
                                { row[nl.Name] = System.DBNull.Value; }
                                else
                                {
                                    //if (DataType != "System.Byte[]")
                                    //{ row[nl.Name] = GetValuesText(DataType, nl.InnerText); }
                                    //if (DataType == "System.Byte[]")
                                    //{
                                    //    row[nl.Name]= Convert.FromBase64String(nl.InnerText);
                                    //}
                                    row[nl.Name] = ReadStr(DataType, nl.InnerText);
                                }

                            }
                        }
                        else
                        {
                            if (value == "System.DBNull.Value")
                            { row[nl.Name] = System.DBNull.Value; }
                            else
                            { row[nl.Name] = value; }
                        }
                    }

                    dt.Rows.Add(row);
                }
                ds.Tables.Add(dt.Copy());
            }

            return ds;
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }
    /// <summary>
    /// 设置DataTable
    /// </summary>
    /// <param name="Key">Key</param>
    /// <param name="dt">DataTable</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <returns></returns>
    public static bool SetTable(string Key, DataTable dt, string FilePath)
    {
        try
        {
            if (string.IsNullOrEmpty(Key))
            { throw new Exception("Key不能为空"); }
          
            if (IsNum(Key))
            { throw new Exception("Key不能以数字开头"); }
            if (IsSpecialChar(Key))
            { throw new Exception("Key不允许包含特殊字符"); }
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement DT = config["DataTable"];
            XmlNode nodeparams2 = DT.SelectSingleNode(Key);//子节点
            if (nodeparams2 == null)
            {
                XmlElement name = doc.CreateElement(Key);
                DT.AppendChild(name);
                //创建列 <DataColumn>
                XmlElement DataColumn = doc.CreateElement("DataColumn");
                name.AppendChild(DataColumn);
                foreach (DataColumn colums in dt.Columns)
                {
                    if (string.IsNullOrEmpty(colums.ColumnName))
                    { throw new Exception("ColumnName不能为空"); }
                    if (IsNum(colums.ColumnName))
                    { throw new Exception("ColumnName不能以数字开头"); }
                    XmlElement ColumnName = doc.CreateElement(colums.ColumnName);
                    if (colums.Unique)
                    { ColumnName.SetAttribute("Unique", colums.Unique.ToString()); }
                    if (colums.AutoIncrement)
                    {
                        ColumnName.SetAttribute("AutoIncrement", colums.AutoIncrement.ToString());
                        if (colums.AutoIncrementStep > 0)
                        { ColumnName.SetAttribute("AutoIncrementStep", colums.AutoIncrementStep.ToString()); }
                        if (colums.AutoIncrementSeed > 0)
                        { ColumnName.SetAttribute("AutoIncrementSeed", colums.AutoIncrementSeed.ToString()); }
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(colums.DefaultValue.ToString()))
                        { ColumnName.SetAttribute("DefaultValue", colums.DefaultValue.ToString()); }
                    }
                    if (colums.ReadOnly)
                    { ColumnName.SetAttribute("ReadOnly", colums.ReadOnly.ToString()); }
                    ColumnName.SetAttribute("DataType", colums.DataType.ToString());
                    ColumnName.SetAttribute("Caption", colums.Caption.ToString());
                    ColumnName.InnerText = colums.ColumnName;
                    DataColumn.AppendChild(ColumnName);
                }

                foreach (DataRow row in dt.Rows)
                {
                    if (row.RowState == DataRowState.Deleted)
                    { continue; }
                    XmlElement table = doc.CreateElement("table");
                    name.AppendChild(table);
                    foreach (DataColumn colums in dt.Columns)
                    {
                        if (string.IsNullOrEmpty(colums.ColumnName))
                        { throw new Exception("ColumnName不能为空"); }
                        if (IsNum(colums.ColumnName))
                        { throw new Exception("ColumnName不能以数字开头"); }
                        XmlElement c = doc.CreateElement(colums.ColumnName);
                        if (!string.IsNullOrEmpty(row[colums.ColumnName].ToString()))
                        { c.InnerText = WriteStr(colums.DataType.ToString(), row[colums.ColumnName]); }
                        else
                        {
                            c.InnerText = "System.DBNull.Value";
                        }

                        table.AppendChild(c);
                    }
                }
            }
            else
            {
                nodeparams2.RemoveAll();
                XmlElement DataColumn = doc.CreateElement("DataColumn");
                nodeparams2.AppendChild(DataColumn);
                foreach (DataColumn colums in dt.Columns)
                {
                    if (string.IsNullOrEmpty(colums.ColumnName))
                    { throw new Exception("ColumnName不能为空"); }
                    if (IsNum(colums.ColumnName))
                    { throw new Exception("ColumnName不能以数字开头"); }
                    XmlElement ColumnName = doc.CreateElement(colums.ColumnName);
                    if (colums.Unique)
                    { ColumnName.SetAttribute("Unique", colums.Unique.ToString()); }
                    if (colums.AutoIncrement)
                    {
                        ColumnName.SetAttribute("AutoIncrement", colums.AutoIncrement.ToString());
                        if (colums.AutoIncrementStep > 0)
                        { ColumnName.SetAttribute("AutoIncrementStep", colums.AutoIncrementStep.ToString()); }
                        if (colums.AutoIncrementSeed > 0)
                        { ColumnName.SetAttribute("AutoIncrementSeed", colums.AutoIncrementSeed.ToString()); }
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(colums.DefaultValue.ToString()))
                        { ColumnName.SetAttribute("DefaultValue", colums.DefaultValue.ToString()); }
                    }
                    ColumnName.SetAttribute("DataType", colums.DataType.ToString());
                    ColumnName.SetAttribute("Caption", colums.Caption.ToString());
                    ColumnName.InnerText = colums.ColumnName;
                    DataColumn.AppendChild(ColumnName);
                }
                foreach (DataRow row in dt.Rows)
                {
                    if (row.RowState == DataRowState.Deleted)
                    { continue; }
                    XmlElement table = doc.CreateElement("table");
                    nodeparams2.AppendChild(table);
                    foreach (DataColumn colums in dt.Columns)
                    {
                        if (IsNum(colums.ColumnName))
                        { throw new Exception("ColumnName不能以数字开头"); }
                        XmlElement c = doc.CreateElement(colums.ColumnName);
                        if (!string.IsNullOrEmpty(row[colums.ColumnName].ToString()))
                        { c.InnerText = WriteStr(colums.DataType.ToString(), row[colums.ColumnName]); }
                        else
                        {
                            c.InnerText = "System.DBNull.Value";
                        }
                        table.AppendChild(c);
                    }
                }
            }
            doc.Save(FilePath);
            return true;
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }
    /// <summary>
    /// 读取DataTable
    /// </summary>
    /// <param name="Key">Key</param>
    /// <param name="FilePath">XML文件路径</param>
    /// <param name="AInc">是否忽略列的AutoIncrement属性,true如果保存表有自增行,就重新获取自增的序号;false按保存的原始数据输出</param>
    /// <returns>DataTable</returns>
    public static DataTable GetDataTable(string Key, string FilePath, bool AInc = true)
    {
        try
        {
            XmlDocument doc = Get_RootDoc(FilePath);
            //4、给文档添加根节点
            XmlElement config = doc.DocumentElement;
            XmlElement DT = config["DataTable"];
            XmlNode nodeparams2 = DT.SelectSingleNode(Key);//子节点
            if (nodeparams2 == null)
            { return null; }
            XmlNode xDc = nodeparams2.SelectSingleNode("DataColumn");//子节点
            if (xDc == null)
            { return null; }
            DataTable dt = new DataTable();
            XmlNodeList DataColumnlist = nodeparams2["DataColumn"].ChildNodes; //xDc.ChildNodes;
            Dictionary<string, XmlNode> dc = new Dictionary<string, XmlNode>();
            DataColumn newColumn;
            if (nodeparams2 == null)
            {
                return null;
            }
            if (DataColumnlist.Count == 0)
            {
                return null;
            }
            foreach (XmlNode item in DataColumnlist)
            {
                newColumn = new DataColumn();
                newColumn.ColumnName = item.InnerText;
                if (!dc.ContainsKey(item.InnerText))
                { dc.Add(item.InnerText, item); }
                bool AutoIncrement = false;
                if (item.Attributes.GetNamedItem("DataType") != null)
                {
                    if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("DataType").Value.ToString()))
                    { newColumn.DataType = System.Type.GetType(item.Attributes.GetNamedItem("DataType").Value.ToString()); }
                }
                if (item.Attributes.GetNamedItem("Caption") != null)
                {
                    if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("Caption").Value.ToString()))
                    { newColumn.Caption = item.Attributes.GetNamedItem("Caption").Value.ToString(); }
                }
                if (item.Attributes.GetNamedItem("Unique") != null)
                {
                    newColumn.Unique = GetStrigToBool(item.Attributes.GetNamedItem("Unique").Value.ToString());
                }
                if (item.Attributes.GetNamedItem("AutoIncrement") != null && AInc)
                {
                    AutoIncrement = GetStrigToBool(item.Attributes.GetNamedItem("AutoIncrement").Value.ToString());
                    newColumn.AutoIncrement = AutoIncrement;
                }
                if (AutoIncrement && AInc)
                {
                    if (item.Attributes.GetNamedItem("AutoIncrementStep") != null)
                    {
                        if (StringToLong(item.Attributes.GetNamedItem("AutoIncrementStep").Value.ToString()) > 0)
                        {
                            newColumn.AutoIncrementStep = StringToLong(item.Attributes.GetNamedItem("AutoIncrementStep").Value.ToString());
                        }
                        if (StringToLong(item.Attributes.GetNamedItem("AutoIncrementSeed").Value.ToString()) > 0)
                        {
                            newColumn.AutoIncrementSeed = StringToLong(item.Attributes.GetNamedItem("AutoIncrementSeed").Value.ToString());
                        }
                    }
                }
                else
                {
                    if (item.Attributes.GetNamedItem("DefaultValue") != null)
                    {
                        if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("DefaultValue").Value.ToString()))
                        { newColumn.DefaultValue = item.Attributes.GetNamedItem("DefaultValue").Value.ToString(); }
                    }
                }
                if (AInc == false)
                {
                    if (item.Attributes.GetNamedItem("DefaultValue") != null)
                    {
                        if (!string.IsNullOrEmpty(item.Attributes.GetNamedItem("DefaultValue").Value.ToString()))
                        { newColumn.DefaultValue = item.Attributes.GetNamedItem("DefaultValue").Value.ToString(); }
                    }
                }
                if (!dt.Columns.Contains(newColumn.ColumnName))
                { dt.Columns.Add(newColumn); }
            }

            XmlNodeList nodelist = nodeparams2.SelectNodes("table");//子节点
            if (nodelist == null)
            {
                return null;
            }
            if (nodelist.Count == 0)
            {
                return null;
            }
            foreach (XmlNode item in nodelist)
            {
                XmlNodeList table = item.ChildNodes;
                DataRow row = dt.NewRow();
                foreach (XmlNode nl in table)
                {
                    string value = nl.InnerText.Trim();
                    XmlNode xn = dc[nl.Name];
                    if (xn != null)
                    {
                        bool AutoIncrement = false, ReadOnly = false;
                        string DataType = "System.String";
                        if (xn.Attributes.GetNamedItem("AutoIncrement") != null && AInc)
                        {
                            AutoIncrement = GetStrigToBool(xn.Attributes.GetNamedItem("AutoIncrement").Value.ToString());
                        }

                        if (xn.Attributes.GetNamedItem("ReadOnly") != null)
                        {
                            ReadOnly = GetStrigToBool(xn.Attributes.GetNamedItem("ReadOnly").Value.ToString());
                        }
                        if (xn.Attributes.GetNamedItem("DataType") != null)
                        {
                            DataType = xn.Attributes.GetNamedItem("DataType").Value.ToString();
                        }
                        if (!AutoIncrement && ReadOnly == false && !string.IsNullOrEmpty(value))
                        {
                            if (value == "System.DBNull.Value")
                            { row[nl.Name] = System.DBNull.Value; }
                            else
                            {
                                //if (DataType != "System.Byte[]")
                                //{ row[nl.Name] = GetValuesText(DataType, nl.InnerText); }
                                //if (DataType == "System.Byte[]")
                                //{
                                //    row[nl.Name] = Convert.FromBase64String(nl.InnerText);
                                //}
                                row[nl.Name] = ReadStr(DataType, nl.InnerText);
                            }

                        }
                    }
                    else
                    {
                        if (value == "System.DBNull.Value")
                        { row[nl.Name] = System.DBNull.Value; }
                        else
                        {
                            row[nl.Name] = value;
                        }
                    }
                }

                dt.Rows.Add(row);
            }

            return dt;
        }
        catch (Exception ex)
        {

            throw ex;
        }
    }
    #region 辅助方法
    /// <summary>
    /// 获取XmlDocument
    /// </summary>
    /// <param name="FilePath">文件路径</param>
    /// <returns></returns>
    private static XmlDocument Get_RootDoc(string FilePath)
    {
        try
        {
            if (!System.IO.File.Exists(FilePath))
            {
                CreateXMLFile(FilePath);
            }
            XmlDocument doc = new XmlDocument();//创建XmlDocument对象                                  
            doc.Load(FilePath);
            return doc;
        }
        catch
        {
            return null;
        }

    }
    #region 创建文件
    /// <summary>
    /// 创建文件
    /// </summary>
    /// <param name="FilePath">XLM文件路径</param>
    /// <returns></returns>
    private static bool CreateXMLFile(string FilePath)
    {
        try
        {


            if (!System.IO.File.Exists(FilePath))
            {
                //1、创建一个XML文档
                XmlDocument doc = new XmlDocument();//创建XmlDocument对象                                  
                                                    //2、创建第一行描述信息
                XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
                //3、将创建的第一行描述信息添加到文档中
                doc.AppendChild(dec);
                //4、给文档添加根节点
                XmlElement config = doc.CreateElement("ConfigRoot");
                doc.AppendChild(config);
                XmlElement Set = doc.CreateElement("Set");
                config.AppendChild(Set);
                XmlElement Dir = doc.CreateElement("Dic");
                config.AppendChild(Dir);
                XmlElement Table = doc.CreateElement("DataTable");
                config.AppendChild(Table);
                XmlElement Sec = doc.CreateElement("Section");
                config.AppendChild(Sec);
                XmlElement DataSet = doc.CreateElement("DataSet");
                config.AppendChild(DataSet);
                doc.Save(FilePath);
            }
            return true;
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }
    #endregion
    #region 值转换
    #region 数据表值转为XML中保存的值
    public static string WriteStr(string type, object Values)
    {
        string reval = string.Empty;

        switch (type)
        {

            case "System.Int16":
                reval = GetStrigToInt(Values.ToString());
                break;
            case "System.Int32":
                reval = GetStrigToInt(Values.ToString());
                break;
            case "System.Int64":
                reval = GetStrigToInt(Values.ToString());
                break;
            case "System.String":
                if (!string.IsNullOrEmpty(Values.ToString()))
                { reval = Values.ToString(); }
                else
                { reval = ""; }
                break;
            case "System.Decimal":
                reval = GetStringTodecimal(Values.ToString());
                break;
            case "System.Char":
                reval = Values.ToString();
                break;
            case "System.Double":
                reval = GetStringToDouble(Values.ToString());
                break;
            case "System.DateTime":
                string v_Values = DateTimeToString(Values);
                if (v_Values != "")
                { reval = v_Values; }
                else
                { reval = ""; }

                break;
            case "System.Boolean":
                reval = GetStrigToBool(Values.ToString()).ToString();
                break;
            //
            case "System.Byte[]":
                reval = ByteToString(Values);
                break;
            default:
                if (!string.IsNullOrEmpty(Values.ToString()))
                { reval = Values.ToString(); }
                else
                { reval = ""; }
                break;
        }
        return reval;
    }
    private static object ReadStr(string type, object Values)
    {
        object reval = string.Empty;

        switch (type)
        {

            case "System.Int16":
                reval = GetStrigToInt(Values.ToString()).ToString();
                break;
            case "System.Int32":
                reval = GetStrigToInt(Values.ToString()).ToString();
                break;
            case "System.Int64":
                reval = GetStrigToInt(Values.ToString()).ToString();
                break;
            case "System.String":
                if (!string.IsNullOrEmpty(Values.ToString()))
                { reval = Values.ToString(); }
                else
                { reval = ""; }
                break;
            case "System.Decimal":
                reval = GetStringTodecimal(Values.ToString()).ToString();
                break;
            case "System.Char":
                reval = Values.ToString();
                break;
            case "System.Double":
                reval = GetStringToDouble(Values.ToString());
                break;
            case "System.DateTime":
             
                if (Values != null)
                { reval = StringToDateTime(Values.ToString()); }
                else
                { reval = ""; }

                break;
            case "System.Boolean":
                reval = GetStrigToBool(Values.ToString()).ToString();
                break;
            //
            case "System.Byte[]":
                reval = StringToByte(Values);
                break;
            default:
                if (!string.IsNullOrEmpty(Values.ToString()))
                { reval = Values.ToString(); }
                else
                { reval = ""; }
                break;
        }
        return reval;

    }
    private static string GetStrigToInt(string Values)
    {
        try
        {
            int i = 0;
            if (int.TryParse(Values, out i))
            { return i.ToString(); }
            else
            { return "0"; }
        }
        catch { return "0"; }
    }
    private static bool GetStrigToBool(string values)
    {
        if (values == "0")
        { values = "False"; }
        if (values == "1")
        { values = "True"; }
        if (values == "是")
        { values = "True"; }
        if (values == "否")
        { values = "False"; }
        if (values.ToLower() == "yes")
        { values = "True"; }
        if (values.ToLower() == "no")
        { values = "False"; }
        if (values.ToLower() == "y")
        { values = "True"; }
        if (values.ToLower() == "n")
        { values = "False"; }
        bool i = false;
        if (bool.TryParse(values, out i))
        {
            return i;
        }
        else
        { return false; }
    }
    private static string ByteToString(object values)
    {
        if (values != null)
        {
           
                byte[] bytes = (byte[])values;
                return Convert.ToBase64String(bytes);    //strTextTostrBin(bytes);
          
           
        }
        else
        { return string.Empty; }
    }
    private static object StringToByte(object values)
    {
        if (values != null)
        {
           return Convert.FromBase64String(values.NullToString());//strBinTostrText(values.NullToString());
           

        }
        else
        { return string.Empty; }
    }
    private static string GetStringTodecimal(string Values)
    {
        decimal d = 0;
        try
        {
            if (decimal.TryParse(Values, out d))
            {
                return d.ToString();
            }
            else { return "0"; }
        }
        catch { return "0"; }
    }
    private static string GetStringToDouble(string Values)
    {
        double d = 0;
        try
        {
            if (double.TryParse(Values, out d))
            {
                return d.ToString();
            }
            else { return "0"; }
        }
        catch { return "0"; }
    }
    private static string GetStringToFloat(string Values)
    {
        float d = 0;
        try
        {
            if (float.TryParse(Values, out d))
            {
                return d.ToString();
            }
            else { return "0"; }
        }
        catch { return "0"; }
    }
    /// <summary>
    /// DateTime毫秒问题
    /// </summary>
    /// <param name="Values"></param>
    /// <returns></returns>
    private static string DateTimeToString(object Values)
    {
        try
        {
            DateTime d = DateTime.Now;
            if (DateTime.TryParse(Values.ToString(), out d))
            {
                DateTime CreatDate = (DateTime)(Values);
                return CreatDate.ToString("yyyy-MM-dd HH:mm:ss.fff");
            }
            else { return "0001-01-01"; }
        }
        catch 
        {
            return "0001-01-01";
        }
    }
    public static DateTime StringToDateTime(string Values)
    {
        try
        {
            string Str = Values.ToString();
            if (Str.IndexOf('.') < 0)
            {
                DateTime d = DateTime.Now;
                if (DateTime.TryParse(Values.ToString(), out d))
                {
                    return d;
                }
                else { return DateTime.Parse("0001-01-01"); }
            }
            else
            {
                string Start_Str = Str.Remove(Str.IndexOf("."));
                string End_Str = Str.Substring(Str.LastIndexOf(".") + 1);
                double md = 0, md2 = 0;
                if (double.TryParse(End_Str, out md))
                { md2 = md; }
                DateTime d = DateTime.Now;
                if (DateTime.TryParse(Start_Str, out d))
                {
                    if (md2 > 0)
                    {
                        d = d.AddMilliseconds(md2);
                       // DateTime CreatDate = (DateTime)(d);
                        return d;
                    }
                    else
                    { return d; }
                }
                else
                { return DateTime.Parse("0001-01-01"); }


            }
        }
        catch { return DateTime.Parse( "0001-01-01"); }
    }
    #endregion
    #region String值转为DataTable的原始值
    private static long StringToLong(string Values)
    {
        long d = 0;
        try
        {
            if (long.TryParse(Values, out d))
            {
                return d;
            }
            else { return 0; }
        }
        catch { return 0; }
    }
    #endregion
    #endregion
    /// <summary>
    /// 判断字符串是否以数字开头
    /// </summary>
    /// <param name="value">字符串</param>
    /// <returns>bool</returns>
  
    private static bool IsNum(string value)
    {
        System.Text.RegularExpressions.Regex regNum = new System.Text.RegularExpressions.Regex("^[0-9]");
        return regNum.IsMatch(value);
    }
    /// <summary>
    /// 只允许包含数字、字母、汉字下划线
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    private static bool IsSpecialChar(string str)
    {
        System.Text.RegularExpressions.Regex regExp = new System.Text.RegularExpressions.Regex("[^0-9a-zA-Z-_.+$\u4e00-\u9fa5]");
        return regExp.IsMatch(str);
    }

    #endregion
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值