正在从.Net读取保存为XML格式的事件日志

本文关键字:格式 XML 事件 日志 保存 Net 读取 | 更新日期: 2023-09-27 18:28:27

我正试图从.Net/C#读取一个保存为XML文件的事件日志,事件日志XML格式(大致)如下:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Events>
    <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>...</Event>
    <Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'>...</Event>
</Events>

其中...位是在模式文件event.xsd.中定义的一系列相对复杂的类型

我的计划是使用XSD.exe生成一个C#包装器类型,用于从此模式文件读取此事件日志XML,然后使用XmlSerializer类取消序列化XML,如下所示:

using (FileStream stream = File.OpenRead(filename))
{
    XmlSerializer serialiser = new XmlSerializer(typeof(Events));
    return (Events)serialiser.Deserialize(stream);
}

问题是模式文件不包含Events元素的定义(因为它不在模式中),因此上面的内容不会编译,因为没有Events类型。

我尝试了几个变体,包括使用类型EventType[]而不是Events(这导致了异常"不应出现")。我还尝试创建自己的C#容器Events类型:

public class Events
{
    [XmlElement]
    public EventType[] Items
    {
        get;
        set;
    }
}

然而,上述情况只是导致Items数组为空。

如何从C#读取保存为XML格式的事件日志?

正在从.Net读取保存为XML格式的事件日志

所以我使用以下类来管理它:

[Serializable]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class Events
{
    [XmlElement("Event", Namespace = "http://schemas.microsoft.com/win/2004/08/events/event")]
    public EventType[] Items
    {
        get;
        set;
    }
}

我不完全确定是什么让它在以前失败的地方工作(我怀疑它是Namespace属性),但我通过使用xsd.exe从保存的事件日志文件中生成一个模式,然后再次从该文件中生成C#类,发现了这一点,如下所示:

xsd /c eventlog.xml
xsd /c eventlog.xsd eventlog_app1.xsd

(因为它编写了两个xsd文件,所以需要在命令行中为它们命名)。然后,我查看了生成的C#,并进行了比较/实验,直到它起作用。