0

カスタム XML ファイルから読み取った設定を格納するために静的クラスを使用するレガシー アプリケーションに取り組んでいます。ただし、モジュールのわずかなアップグレードの一環として、顧客は実行時にどのフィールドが欠落しているかを確認したいと考えています。
次の Settings.xml ファイルを検討してください。

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
    <configuration>
        <API>
            <log>
                <type>09</type>
                <location>C:\Test\Test.log</filename>
            </log>
        </API>
    </configuration>
</appSettings>  

設定は現在、XMLReader を使用して静的クラスに読み込まれます (以下を参照)。

        using (XmlTextReader xmlReader = new XmlTextReader("Settings.xml"))
        {
            xmlReader.ReadToFollowing("API");
            xmlReader.ReadToFollowing("log");
            xmlReader.ReadToFollowing("type");
            this.logtype = xmlReader.ReadElementContentAsString(); 
        //snip...
        }

この同じコードを使用して、すべての設定を読み取ります。もっと良い方法があるはずです。XML 値を対応する各プロパティに読み込み、null の場合にエラーを生成する方法はありますか?
私は静的設定クラスを次のように設計しようとしています:

public static class Settings
    {
        private static string logtype

        public static string LogType
        {
            get
            { return logtype; }

            set
            { logtype = value; }
        }
    }

そして、次のようなものを使用して値を「取得」します。

public static void initSettings()
        {
            appSettings.LogType = read the configuration\API\log\type field from xml;
        }

プロパティコンストラクターでnull文字をチェックするだけだと確信していますが、initSettingsメソッドの「xmlから構成\API\log\typeフィールドを読み取る」部分をどのように行うのですか?

4

3 に答える 3

1

LINQ2XMLを使用してください..そのCOOL

XELement doc=XElement.Load("yourXML.xml");

var LogList=doc.Descendants("configuration").Descendants("API").Descendants("log")
.Select(x=>
new
{
type=x.Element("type").Value;
location=x.Element("location").Value;
}
);

for-each ループを使用して、logList のすべてのログにアクセスできるようになりました。

foreach(var log in logList)
{
Console.WriteLine(log.type);
Console.WriteLine(log.location);
}

また、空かどうかを確認することもできます

if(log.type==""){//its empty}
于 2012-10-05T03:28:35.453 に答える
0

XMLDocument / XPath を使用できます。このようなもの:

XmlDocument doc = new XmlDocument();
doc.Load("Settings.xml");
appSettings.LogType = doc.SelectSingleNode("/appSettings/configuration/API/log/type").InnerText;

実際には、シリアライゼーションを使用したいと思います。おそらく、いくつかの便利なエラー処理を提供するYAXLibの標準シリアライゼーションです。

編集:私にとっては、InnerText で動作しています。

于 2012-10-04T20:30:01.563 に答える
0

個人的には XmlNodeList を使用することを好みます。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("Settings.xml");
// Get element from xml.
XmlNodeList type = xmlDoc.GetElementsByTagName("type");
// The following line assumes that there is only 1 type entry
appSettings.LogType = type[0].InnerText;

取得したいエントリが複数ある場合は、for ステートメントで叩くだけです。

for (int i = 0; i < type.Count; i++)
{
    // Do stuff
    appSettings.LogType = type[i].InnerText;
}
于 2012-10-05T01:15:54.423 に答える