【问题标题】:Querying an XML log with LINQ使用 LINQ 查询 XML 日志
【发布时间】:2016-03-31 21:44:35
【问题描述】:

我正在使用 FileWatcher 将文件夹的所有更改记录到 XML 文件中

XDocument log = XDocument.Load(logpath);
XElement change = new XElement("change");
change.Add(new XAttribute("datetime", stamp));
change.Add(new XAttribute("status", "Deleted"));
change.Add(new XAttribute("filename", filepath));


log.Add(change);
log.Save(logpath);

然后,当我想查看某个时间戳所做的更改时,我使用

查询它
var query = _filelog.Elements().Where(x => ((DateTime)x.Element("datetime")) <= time);

这只是 XElements 的 IEnumerable,使用起来不太方便。如何将其变成更方便的集合,例如键值对状态的字典列表:“已删除”等? XElement 中有不同数量的 XAttribute,具体取决于更改的类型。

此外,有没有办法查询每个文件名的最后更改直到时间戳,而不是每个更改直到并包括该点?

【问题讨论】:

  • 如果上面的代码是你正在使用的实际代码,你正在构建的日志系统是非常无用和缓慢的。日志系统需要快速且永不失败 - 为每个日志条目加载和存储 xml 文件都不是,即使为了简单起见我们忘记了线程。最流行的日志库使用非结构化输出是有充分理由的:快速、可靠、适合流式传输
  • 我很高兴地说,这可能是我第一次看到在一个句子中一起使用“XML 日志”这两个词。使用XDocument 已经很慢了。任何让事情变得更方便的事情只会让事情变得更慢。

标签: c# xml linq


【解决方案1】:

尝试以下解决方案之一。首先是 DateTime 是否唯一,其次是 DateTime 值是否重复。

            Dictionary<DateTime, XElement> dict1 = doc.Elements("change")
                .GroupBy(x => DateTime.Parse(x.Attribute("datetime").Value), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());

            Dictionary<DateTime, List<XElement>> dict2 = doc.Elements("change")
                .GroupBy(x => DateTime.Parse(x.Attribute("datetime").Value), y => y)
                .ToDictionary(x => x.Key, y => y.ToList());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多