我试图从.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格式的事件日志?
答案 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#并进行了比较/实验,直到它起作用。