有没有办法在不使用 XDocument 的情况下将新的 xml 数据附加到 xml 文件中的现有 xml?
Posted
技术标签:
【中文标题】有没有办法在不使用 XDocument 的情况下将新的 xml 数据附加到 xml 文件中的现有 xml?【英文标题】:Is there a way to append new xml data to already existing xml in an xml file without using XDocument? 【发布时间】:2020-11-14 15:33:31 【问题描述】:通常,我将日志消息写入 xml 文件。我用Linq
的XDocument
。
当 xml 日志变大时,我通常会出现无响应的 UI,因此我正在寻找实现相同结果的替代方法。
以下是我如何使用Linq
登录到 xml 文件的摘录。
// Create the xml file if it does not exist
if (!File.Exists(_filePath))
_xmlDocument = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
new XElement("Logs"));
_xmlDocument.Save(_filePath);
// Load the xml file
_xmlDocument = XDocument.Load(_filePath);
// Add new log to the logs
_xmlDocument?.Element("Logs")?
.AddFirst(new XElement($"logLevel.ToString()",
new XAttribute("Date", DateTime.Now.ToString("g")),
new XAttribute("Filepath", $"values?[1]"),
new XElement("Exception", new XAttribute("EventId", eventId), exception.Source),
new XElement("Message",
new XAttribute("Origin", $"values?[0]"),
new XAttribute("LineNumber", $"values?[2]"),
$"values?[3]")
)
);
// Save the document
_xmlDocument.Save(_filePath);
【问题讨论】:
两件事:1)您正在使用 .AddFirst 它在顶部插入条目,这意味着必须随着时间的推移移动许多条目 - .AppendChild 会表现更好。 2)避免使用?因为您已经确保文档可用。 我希望新日志始终保持在顶部。 【参考方案1】:一种技术是像这样维护日志文件
<log-entry.../>
<log-entry.../>
<log-entry.../>
没有封闭的包装元素。这意味着您可以使用普通的文件附加方法附加到它。然后,当您想将其读取为 XML 时,将其作为外部实体从另一个文件中引用:
<!DOCTYPE log [
<!ENTITY e SYSTEM "logdata.xml">
]>
<log>&e;</log>
您在读取文件时仍会承担全部解析成本,但您现在可以直接且廉价地附加到该文件。
当然,缺点是现在的安全人员对外部实体偏执。
【讨论】:
您能否指出任何有助于实施您建议的技术的参考资料? 一本关于 XML 的好书,就像 Bob du Charme 的书,告诉您有关实体的所有知识。就我个人而言,我很少使用 XML 实体,但偶尔会出现这样的问题,因为它们非常方便。【参考方案2】:您可以尝试像使用数据表一样使用 Xml 文件,插入一条记录,然后再次写入该文件。 例如:
DataSet oDataset = new DataSet();
oDataset.ReadXml(yourfile);
DataTable dt = oDataset.Tables["yourtable"];
//Insert a record
oDataset.WriteXml(yourfile);
【讨论】:
这种方法有什么值得关注的取舍吗? 我用它管理配置文件很多年了,以前是.ini文件,从来没出过问题。以上是关于有没有办法在不使用 XDocument 的情况下将新的 xml 数据附加到 xml 文件中的现有 xml?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不覆盖现有类名的情况下将类名添加到 blazor 组件?
有没有办法在不创建***结构的情况下将 JSON 解码为结构
有没有办法在不将完整文件加载到内存的情况下将 tiff 图像转换为 Base64