2

XmlTextReaderプログラムの使用方法とXmlTextWriter構成ファイルを理解しようとしています。

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(しかし私はそれを見つけることができませんでした)。そして最後に、xmlファイルXmlTextWriter全体を上から下に書き直さずにxmlファイルの値を更新する方法をまだ理解していません。

4

1 に答える 1

6

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

于 2012-07-24T09:36:24.710 に答える