簡體   English   中英

從列表框更新XML LINQ

[英]Update XML LINQ from ListBox

我在發現如何使用LINQ用列表框中的值更新XML文件時遇到了一些麻煩。

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

更新:與其比較兩個列表,不如從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。

知道為什么它不寫列表框中的所有三個項目嗎?

  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。

問題是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));
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM