Update XML LINQ from ListBox
本文关键字:ListBox from LINQ XML Update | 更新日期: 2023-09-27 18:19:40
我在发现如何使用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>
我正在使用更新"姓名"answers"作者"字段
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中删除"文件"元素,然后将列表框中的值添加回来。
使用此代码,我可以删除所有"file"元素,但当我尝试从列表框中添加值时,只有最后一个值被写入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.
你知道为什么这没有把列表框中的三个项目都写出来吗?
-
我会逐步检查您的代码,以确保它在每个文件中循环。还要仔细检查并确保"s"设置为正确的文件。
-
如果它在每个文件中循环并成功调用"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添加了一个"file"元素,然后在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));
}