using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
namespace GeoSigma.SigmaDrawerUtil
{
public class XmlConfig
{
public virtual string SectionName { get; set; }
public string FileName; //INI文件名
string fileName = "\\SigmaConfig.xml";
XDocument xmlDoc;
private XElement sectionElement;
///
/// 构造函数
///
public XmlConfig()
{
if(string.IsNullOrEmpty(SectionName))
{
return;
}
var path = Application.StartupPath;
var strXmlFile = path + fileName;
if (!File.Exists(strXmlFile))
{
xmlDoc = new XDocument();
}
else
{
xmlDoc = XDocument.Load(strXmlFile);
}
// 取到根结点
XElement rootEle = xmlDoc.Element("Config");
if(rootEle == null)
{
xmlDoc.Add(new XElement("Config"));
rootEle = xmlDoc.Element("Config");
}
sectionElement = rootEle.Element(SectionName);
if (sectionElement == null)
{
rootEle.Add(new XElement(SectionName));
sectionElement = rootEle.Element(SectionName);
}
}
///
/// 相关属性
///
public virtual void ResetAttributes()
{
if (SectionAttributes != null && SectionAttributes.Count > 0)
{
for (int i = 0; i < SectionAttributes.Count; i++)
{
XAttribute attr = sectionElement.Attribute(SectionAttributes[i].Name);
if (attr != null)
{
attr.Value = SectionAttributes[i].Value;
}
else
{
sectionElement.Add(SectionAttributes[i]);
}
}
}
}
public List SectionAttributes
{
get;
set;
} = new List();
public string GetValue(string key)
{
string strValue = sectionElement.Element(key)?.Value;
return strValue;
}
public void SetValue(string key, string value)
{
XElement ele = sectionElement.Element(key);
if(ele == null)
{
sectionElement.Add(new XElement(key, value));
}
else
{
ele.Value = value;
}
}
public void ResetValues(string key, List values)
{
List elements = sectionElement.Elements(key).ToList();
for(int i = 0; i < elements.Count; i++)
{
elements[i].Remove();
}
foreach(string eleValue in values)
{
sectionElement.Add(new XElement(key, eleValue));
}
}
public void Save()
{
var path = Application.StartupPath;
var strXmlFile = path + fileName;
xmlDoc?.Save(strXmlFile);
}
///
/// 查找所有指定键对应的值
///
///
///
public List FindValues(string key)
{
IEnumerable eles =
from ele in sectionElement.Elements()
where ele.Name.ToString().Equals(key)
select ele.Value;
return eles?.ToList();
}
////写INI文件
//public void WriteString(string Section, string Ident, string Value)
//{
// if (!WritePrivateProfileString(Section, Ident, Value, FileName))
// {
// throw (new ApplicationException("写Ini文件出错"));
// }
//}
////读取INI文件指定
//public string ReadString(string Section, string Ident, string Default)
//{
// Byte[] Buffer = new Byte[65535];
// int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
// //必须设定0(系统默认的代码页)的编码方式,否则无法支持中文
// string s = Encoding.GetEncoding(0).GetString(Buffer);
// s = s.Substring(0, bufLen);
// return s.Trim();
//}
////读整数
//public int ReadInteger(string Section, string Ident, int Default)
//{
// string intStr = ReadString(Section, Ident, Convert.ToString(Default));
// try
// {
// return Convert.ToInt32(intStr);
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// return Default;
// }
//}
////写整数
//public void WriteInteger(string Section, string Ident, int Value)
//{
// WriteString(Section, Ident, Value.ToString());
//}
////读布尔
//public bool ReadBool(string Section, string Ident, bool Default)
//{
// try
// {
// return Convert.ToBoolean(ReadString(Section, Ident, Convert.ToString(Default)));
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// return Default;
// }
//}
////写Bool
//public void WriteBool(string Section, string Ident, bool Value)
//{
// WriteString(Section, Ident, Convert.ToString(Value));
//}
////从Ini文件中,将指定的Section名称中的所有Ident添加到列表中
//public void ReadSection(string section, StringCollection Idents)
//{
// Byte[] Buffer = new Byte[16384];
// //Idents.Clear();
// int bufLen = GetPrivateProfileString(section, null, null, Buffer, Buffer.GetUpperBound(0), FileName);
// //对Section进行解析
// GetStringsFromBuffer(Buffer, bufLen, Idents);
//}
//private void GetStringsFromBuffer(Byte[] Buffer, int bufLen, StringCollection Strings)
//{
// Strings.Clear();
// if (bufLen != 0)
// {
// int start = 0;
// for (int i = 0; i < bufLen; i++)
// {
// if ((Buffer[i] == 0) && ((i - start) > 0))
// {
// String s = Encoding.GetEncoding(0).GetString(Buffer, start, i - start);
// Strings.Add(s);
// start = i + 1;
// }
// }
// }
//}
////从Ini文件中,读取所有的Sections的名称
//public void ReadSections(StringCollection SectionList)
//{
// //Note:必须得用Bytes来实现,StringBuilder只能取到第一个Section
// byte[] Buffer = new byte[65535];
// int bufLen = 0;
// bufLen = GetPrivateProfileString(null, null, null, Buffer,
// Buffer.GetUpperBound(0), FileName);
// GetStringsFromBuffer(Buffer, bufLen, SectionList);
//}
////读取指定的Section的所有Value到列表中
//public void ReadSectionValues(string Section, NameValueCollection Values)
//{
// StringCollection KeyList = new StringCollection();
// ReadSection(Section, KeyList);
// Values.Clear();
// foreach (string key in KeyList)
// {
// Values.Add(key, ReadString(Section, key, ""));
// }
//}
////清除某个Section
//public void EraseSection(string Section)
//{
// if (!WritePrivateProfileString(Section, null, null, FileName))
// {
// throw (new ApplicationException("无法清除Ini文件中的Section"));
// }
//}
////删除某个Section下的键
//public void DeleteKey(string Section, string Ident)
//{
// WritePrivateProfileString(Section, Ident, null, FileName);
//}
////Note:对于Win9X,来说需要实现UpdateFile方法将缓冲中的数据写入文件
////在Win NT, 2000和XP上,都是直接写文件,没有缓冲,所以,无须实现UpdateFile
////执行完对Ini文件的修改之后,应该调用本方法更新缓冲区。
//public void UpdateFile()
//{
// WritePrivateProfileString(null, null, null, FileName);
//}
////检查某个Section下的某个键值是否存在
//public bool ValueExists(string Section, string Ident)
//{
// StringCollection Idents = new StringCollection();
// ReadSection(Section, Idents);
// return Idents.IndexOf(Ident) > -1;
//}
////确保资源的释放
//~Config()
//{
// UpdateFile();
//}
}
}