Using xml for a configuration file
c#, xml
Solution
You could use `XmlSerializer` to serialize and deserialize an arbitrary configuration class. Here is a sample implementation:
public enum MyEnum
{
ValueA,
ValueB
}
[Serializable]
public class Configuration : PersistableObject
{
public double A { get; set; }
public string B { get; set; }
public MyEnum C { get; set; }
}
public class PersistableObject
{
public static T Load<T>(string fileName) where T : PersistableObject, new()
{
T result = default(T);
using (FileStream stream = File.OpenRead(fileName))
{
result = new XmlSerializer(typeof(T)).Deserialize(stream) as T;
}
return result;
}
public void Save<T>(string fileName) where T : PersistableObject
{
using (FileStream stream = new FileStream(fileName, FileMode.CreateNew))
{
new XmlSerializer(typeof(T)).Serialize(stream, this);
}
}
}
For more information on how to configure XmlSerializer, have a look at the MSDN article: http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx
Problem
I'm trying to figure out how to use `XmlTextReader` and `XmlTextWriter` for the configuration file of my program(s). The xml file looks like this: ``` <?xml version="1.0" encoding="utf-8"?> <Base> <Global> <some_config_value>86400</some_config_value> <test1>t_1</test1> <test2>t_2</test2> <test3>t_3</test3> <test4>t_4</test4> </Global> <test_head> <test5>t_5</test5> <test6>t_6</test6> </test_head> </Base> ``` And here is the class I have so far: ``` using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; namespace my_program.Global { class CXMLConfig { private string path; public CXMLConfig(string filepath) { path = filepath; } public string XmlReadValue(string Section, string Key) { XmlTextReader textReader = new XmlTextReader(path); ReadElements readEl = new ReadElements(textReader, Section, Key); textReader.Close(); return readEl.Value; } private class ReadElements { XmlTextReader textReader; string Section; string Key; private bool inBase = false; private bool inSection = false; private bool inKey = false; public string Value { get; private set; } public ReadElements(XmlTextReader textReader_set, string Section_set, string Key_set) { Value = ""; this.textReader = textReader_set; this.Section = Section_set; this.Key = Key_set; textReader.Read(); while (textReader.Read()) { // Move to fist element textReader.MoveToElement(); string nodetype = textReader.NodeType.ToString(); if (textReader.LocalName == "Base") { if (nodetype == "Element") { if (!inBase) inBase = true; } else if (nodetype == "EndElement") { if (inBase) inBase = false; } } else if (inBase && textReader.LocalName == Section) { if (nodetype == "Element") { if (!inSection) inSection = true; } else if (nodetype == "EndElement") { if (inSection) inSection = false; } } else if (inBase && inSection && textReader.LocalName == Key) { if (inSection) { if (nodetype == "Element") { if (!inKey) inKey = true; } else if (nodetype == "EndElement") { if (inKey) inKey = false; } } } else if (inBase && inSection && inKey) { if (nodetype == "Text") { Value = textReader.Value.ToString(); //Console.WriteLine(Value); } } } } } } } ``` So first of all, this is probably bad XML.. I have never used it before and it does look a little.. odd. And then there is the fact that I wrote this whole `ReadElements` class to read a value out of the config file, but I imagined there would be a much simpler way to do this with `XmlTextReader` (but I couldn't find it). And then lastly, I have yet to figure out how to update a value in the xml file using `XmlTextWriter` without re-writing the whole xml file from top to bottom.