2013-06-24 60 views
0

我在發現如何使用LINQ更新列表框中的值來更新XML文件時遇到了一些問題。更新列表框中的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); 

我怎麼能對比較值的列表框值XML文件中的「文件」元素,然後相應地添加/刪除/更新XML文檔中的「文件」值?

更新: 比較兩個列表相反的,它可能是更容易去除來自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。

任何想法,爲什麼這不寫在列表框中的所有三個項目?

+0

不** **相當確定要在這裏做... –

+0

僅供參考,你可以通過做xDoc.Descendants(「腳本」)減少你的LINQ的要求是什麼FirstOrDefault (t =>(int)t.Attribute(「id」)== id);而不是xDoc.Descendants(「script」)。where(t =>(int)t.Attribute(「id」)== id).FirstOrDefault(); – orel

回答

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)); 
      } 
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。

+0

謝謝mattijo,我會看看那個。 – mack