0

リストボックスの値で XML ファイルを更新するために LINQ を使用する方法を見つけるのに苦労しています。

XML ファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<scripts>
  <script id="3">    
    <name>Test</name>
    <author>Test Author</author>
    <filestoProcess>
      <file>testfile.jpg</file>
      <file>testfile1.jpg</file>
    </filestoProcess>
  </script>
</scripts>

そして、次を使用して「名前」フィールドと「作成者」フィールドを更新しています。

    XDocument xDoc = XDocument.Load("..\\..\\XMLTest.xml");
    XElement uElem = xDoc.Descendants("script").Where(t => (int)t.Attribute("id") == id).FirstOrDefault();           
    uElem.SetElementValue("name", txtScriptTitle.Text);
    uElem.SetElementValue("author", cmboAuthor.Text);

ListBox の値を XML ファイルの "file" 要素の値と比較し、XML ドキュメントの "file" 値を適切に追加/削除/更新するにはどうすればよいですか?

更新: 2 つのリストを比較する代わりに、XML から「ファイル」要素を削除してから、リストボックスに保持されている値を追加し直す方がおそらく簡単です。

このコードを使用すると、すべての「ファイル」要素を削除できますが、リストボックスから値を追加しようとすると、最後の値のみが XML ファイルに書き込まれます。

        // Remove all "file" elements from XML
        uElem.Descendants("file").ToList().ForEach(i => i.Remove());

        // Now add the elements from the listbox
        foreach (string s in lbFilesToProcess.Items)
        {
            uElem.Element("filestoProcess").SetElementValue("file", s);
        }

たとえば、私のリストボックスには file2.jpg、file2.jpg、file3.jpg が含まれていますが、上記のコードを実行した後に XML ファイルを表示すると、file3.jpg しか表示されません。

これがリストボックスに保持されている 3 つの項目すべてを書き込まない理由は何ですか?

4

2 に答える 2

0
  1. コードをステップ実行して、各ファイルをループしていることを確認します。また、「s」が正しいファイルに設定されていることを再確認してください。

  2. 各ファイルをループし、「SetElementValue」を正常に呼び出す場合、「foreach」のループごとに「filesToProcess」ノードを取得する必要があることに関連している可能性があります。あなたが持っているものではなく、これを試してください:

    // Now add the elements from the listbox
    var filesToProcessNode = uElem.Element("filestoProcess");
    foreach (string s in lbFilesToProcess.Items)
    {
        filestoProcessNode.SetElementValue("file", s);
    }
    

ここでの私の考えは、Linq を使用しているため、ファイルへの変更をコミットする方法に関するタイミングの問題である可能性があり、ループするたびに操作をオーバーライドしているだけであり、最後のファイルのみが作成される理由です。

HTH。

于 2013-06-24T21:05:49.063 に答える
0

問題は、SetElementValue が単一の「ファイル」要素を追加し、foreach ループをループするときに値を上書きしていたため、リストボックスの最後の値のみが XML ファイルに格納されていたことです。新しい要素を追加すると、問題が解決しました。以下のコードが機能しました。

            // Remove all "file" elements from selected record
            uElem.Descendants("file").ToList().ForEach(i => i.Remove());
            // Now add the elements from the listbox
            foreach (string s in lbFilesToProcess.Items)
            {
                // Add the new "file" element with the values from the listbox
                uElem.Element("filestoProcess").Add(new XElement("file", s));
            }
于 2013-06-25T14:17:41.067 に答える