使用xml作为配置文件

时间:2012-07-24 09:13:44

标签: c# xml

我正在尝试弄清楚如何将XmlTextReaderXmlTextWriter用于我的程序的配置文件。

xml文件如下所示:

<?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>

这是我到目前为止的课程:

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

        }
    }
}

首先,这可能是糟糕的XML ..我之前从未使用它,它确实看起来有点......奇怪。然后有一个事实是我写了整个ReadElements类来从配置文件中读取一个值,但我想有一个更简单的方法用XmlTextReader来做这个(但我不能找不到它。最后,我还没有弄清楚如何使用XmlTextWriter更新xml文件中的值,而无需从上到下重写整个xml文件。

1 个答案:

答案 0 :(得分:5)

您可以使用XmlSerializer序列化和反序列化任意配置类。以下是一个示例实现:

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

有关如何配置XmlSerializer的更多信息,请查看MSDN文章:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx