c# - XMLSerializer 在 n 行(行)之后创建一个新文件
问题描述
我对 XMLSerializer 有疑问:我有一个列表,并且想使用 XMLSerializer 将列表的内容写入 XML。整个事情也很好。但是在 n 行之后,我想用 XMLSerializer 将数据写入一个新的 XML,但数据总是写入现有的 XML。
如何解决在 n 行之后创建一个新的 XML 文件的问题?
序列化的代码:
private void SaveLogFile()
{
bf = new BaseFunctions();
try
{
XmlSerializer seri = new XmlSerializer(typeof(List<LVProperties>));
TextWriter wr = new StreamWriter(FilePath);
seri.Serialize(wr, FileWatcher.Data);
wr.Close();
}
catch (Exception ex)
{
bf.app_Errorhandler(ex);
return;
}
}
为 Listview 和 datatable 收集数据以进行序列化的代码:
public static List<LVProperties> Data = new List<LVProperties>();
[STAThread]
private void LogDataToLV()
{
ff = new FileFunctions();
vlp = new LVProperties();
bf = new BaseFunctions();
bf.ReadAppInfos();
_lvLogMe.Dispatcher.BeginInvoke(new Action(delegate ()
{
if (bf.osVersion.Major == 6 && bf.osVersion.Minor >= 2 || bf.osVersion.Major >= 10 && bf.osVersion.Minor >= 0)
{
LogMeUser = ff.getFileDetails(LogMePath, LogMeFile, FileFunctions.FileDetailInfo.Title); //Problem mit InvalidCastException!!
LogMeSize = ff.getFileDetails(LogMePath, LogMeFile, FileFunctions.FileDetailInfo.Size);
}
else
{
LogMeUser = "not supported by OS";
LogMeSize = "unknown";
}
_lvLogMe.Items.Add(new LVProperties { lv_LogMeDate = LogMeDate, lv_LogMeEvent = LogMeEvent, lv_LogMeFile = LogMeFile, lv_LogMePath = LogMePath, lv_LogMeUser = LogMeUser, lv_LogMeSize = LogMeSize });
Data.Add(new LVProperties { lv_LogMeDate = LogMeDate, lv_LogMeEvent = LogMeEvent, lv_LogMeFile = LogMeFile, lv_LogMePath = LogMePath, lv_LogMeUser = LogMeUser, lv_LogMeSize = LogMeSize });
_lvLogMe.SelectedIndex = _lvLogMe.Items.Count - 1;
_tbLogCount.Text = _lvLogMe.Items.Count.ToString();
if (VisualTreeHelper.GetChildrenCount(_lvLogMe) > 0)
{
Border border = (Border)VisualTreeHelper.GetChild(_lvLogMe, 0);
ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0);
scrollViewer.ScrollToBottom();
}
_lvLogMe.UpdateLayout();
_lvLogMe.DataContext = Data;
LVRowCount = _lvLogMe.Items.Count;
if (sXML.SaveLogAuto == "true")
{
if (LVRowCount == 10)
{
SaveLogFile();
}
}
if (_lvLogMe.Items.Count == 10)
{
_lvLogMe.Items.Clear();
Data.Clear();
}
}));
}
解决方案
XML 序列化器的根目录不能有数组/列表。由于您有一个列表,因此您必须将列表包装在另一个类中。为了能够移动到 xml 中的某个位置,您必须使用 xml 阅读器。请参阅下面的代码:
public class Test
{
BaseFunctions bf = new BaseFunctions();
private void SaveLogFile()
{
bf = new BaseFunctions();
Root root = new Root();
MemoryStream stream = new MemoryStream();
try
{
XmlSerializer seri = new XmlSerializer(typeof(Root);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
XmlWriter writer = XmlWriter.Create(stream, settings);
seri.Serialize(writer, root);
stream.Position = 0;
XmlReader reader = XmlReader.Create(stream);
reader.ReadToFollowing("Node");
}
catch(Exception ex)
{
}
}
}
public class BaseFunctions
{
}
public class Root
{
[XmlElement("Properties")]
List<LVProperties> properties = new List<LVProperties>();
}
public class LVProperties
{
}
}
推荐阅读
- java - 如何在 pl/pgsql 中创建返回 refcursor 和 totalRow 的函数/过程?
- javascript - 纠正这个for循环?
- android - 重新映射设备电源按钮以显示对话框
- node.js - 如何按顺序解构多个查询结果?
- c# - 是否可以在单个 API 调用中从 Azure Blob 存储中检索多个 Blob?
- linux - Linux Pipe 命令是否需要一个进程来执行?
- php - PHP递归树视图生成器仅从填充的“选定”数组中选择一个选项?
- vuejs2 - 无法使用 Vuex 获取项目
- ios - UITapGestureRecognizer 在完成之前不会更新 UIView
- reinforcement-learning - 使用新动作/扩展动作集进行强化学习