正在从.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格式的事件日志?
所以我使用以下类来管理它:
[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#,并进行了比较/实验,直到它起作用。