0

我在发现如何使用 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 文件中的“文件”元素的值进行比较,然后适当地添加/删除/更新 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。

知道为什么这不会写出列表框中的所有三个项目吗?

4

2 回答 2

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 回答
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 回答