1

C#を使用してXMLファイルに要素を追加する際に問題が発生しました。App.configdiffディレクトリのどこかにファイルがあります。そのため、LINQを使用して必要な値を取得し、TextBoxから値を設定しています。

<appSettings>
    <add key="Something" value="false" />
    <add key="UserName" value="user0001" />
    <add key="Password" value="123456" />
    <add key="Environment" value="" />
    <add key="DBUserName" value="DBname23" />
    <add key="DBPassword" value="12345678" />
</appSettings>

上記は私のXMLファイルです。UserNameとの値を取得Passwordし、暗号化された値で設定することができます。私がしている方法を以下に示します。

var doc1 = XDocument.Load(appConfigFile1);

var list1 = from appNode in doc1.Descendants("appSettings").Elements()
            where appNode.Attribute("key").Value == "UserName"
            select appNode;
var list2 = from appNode in doc1.Descendants("appSettings").Elements()
            where appNode.Attribute("key").Value == "Password"
            select appNode;
var list3 = from appNode in doc1.Descendants("appSettings").Elements()
            where appNode.Attribute("key").Value == "DBUserName"
            select appNode;
var list4 = from appNode in doc1.Descendants("appSettings").Elements()
            where appNode.Attribute("key").Value == "DBPassword"
            select appNode;
var element1 = list1.FirstOrDefault();
var element2 = list2.FirstOrDefault();
var element3 = list3.FirstOrDefault();
var element4 = list4.FirstOrDefault();
element1.Attribute("value").SetValue(txtbox1);
element2.Attribute("value").SetValue(txtbox2);
element3.Attribute("value").SetValue(txtbox3);
element4.Attribute("value").SetValue(txtbox4);
doc1.Save(appConfigFile1);

要件は、XMLファイルの要素の1つが削除された場合に、キーと値を使用して同じ要素を作成できるようにすることです。

例:上記のxmlを以下と比較してください。

<appSettings>
    <add key="HasUI" value="false" />
    <add key="Password" value="123456" />
    <add key="Environment" value="" />
    <add key="DBUserName" value="DBname23" />
    <add key="DBPassword" value="12345678" />
</appSettings>

要素の上にユーザー名がありません。では、どのようにしてのようなXML要素を作成し、 <add key="UserName" value="" />それをXMLファイルの同じ場所に設定できますか?

C#でXMLファイルをロードするときに発生するエラーはNullReferenceExceptionです。

私を助けてください。

4

3 に答える 3

3

善のために、あなたが複数回行うことはすべて関数でなければなりません!

function UpdateOrCreateAppSetting(XMLDocument doc, string key, string value)
{
    var list = from appNode in doc.Descendants("appSettings").Elements()
            where appNode.Attribute("key").Value == key
            select appNode;
    var e = list.FirstOrDefault();

    // If the element doesn't exist, create it
    if (e == null) {
        e = doc.CreateElement("add")
        e.Attributes.Append("key", key);
        e.Attributes.Append("value", value);
        doc.Descendants("appSettings").AppendChild(e);

    // If the element exists, just change its value
    } else {
        e.Attribute("value").SetValue(value);
    }
}

関数を4回呼び出すと、問題ありません。;)

于 2012-07-24T22:45:59.243 に答える
1

app.configが期待どおりでないときにデフォルト値を設定したい場合は、次のようにすることができます。

var doc1 = XDocument.Load(appConfigFile1);

                var list1 = from appNode in doc1.Descendants("appSettings").Elements()
                            where appNode.Attribute("key").Value == "UserName"
                            select appNode;
                var list2 = from appNode in doc1.Descendants("appSettings").Elements()
                            where appNode.Attribute("key").Value == "Password"
                            select appNode;
                var list3 = from appNode in doc1.Descendants("appSettings").Elements()
                            where appNode.Attribute("key").Value == "DBUserName"
                            select appNode;
                var list4 = from appNode in doc1.Descendants("appSettings").Elements()
                            where appNode.Attribute("key").Value == "DBPassword"
                            select appNode;
                // the values of missing elements are null so you can use the "??" operator                                               //hat put something else when you have null
                var element1 = list1.FirstOrDefault() ?? "your default value";
                var element2 = list2.FirstOrDefault() ?? "your default value";
                var element3 = list3.FirstOrDefault() ?? "your default value";
                var element4 = list4.FirstOrDefault() ?? "your default value";
                element1.Attribute("value").SetValue(txtbox1);
                element2.Attribute("value").SetValue(txtbox2);
                element3.Attribute("value").SetValue(txtbox3);
                element4.Attribute("value").SetValue(txtbox4);
                doc1.Save(appConfigFile1);
于 2012-07-24T21:22:22.920 に答える
0

NullReferenceはで来ています

element1.Attribute("value").SetValue(txtbox1);

ステートメント、そうではありませんか?上記のFirstOrDefaultにより、element1はnullのままになっています。Attributeプロパティにアクセスする前にnullをテストしたいと思います。そのテストに失敗した場合は、デフォルトを指定できます。

于 2012-07-24T21:22:56.450 に答える