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

时间:2012-03-21 14:45:18

标签: c# xsd event-log xmlserializer

我试图从.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元素的定义(因为它不在模式中),所以上面没有编译,因为没有{ {1}}输入。

我尝试了几种变体,包括使用Events类型代替EventType[](导致异常&#34;未被预期。&#34;)。我还尝试制作自己的C#容器Events类型:

Events

但是,上述情况只会导致public class Events { [XmlElement] public EventType[] Items { get; set; } } 数组为空。

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

1 个答案:

答案 0 :(得分:2)

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

[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#并进行了比较/实验,直到它起作用。