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(); //} } }