有没有办法在不使用 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 文件。我用LinqXDocument

当 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

有没有办法在不离开 App 的情况下将评分发送到 App Store?

有没有办法在不向表格元素添加类的情况下将 css 应用于元素? [复制]