Чтение журналов событий, сохраненных в формате XML из .Net - PullRequest
1 голос
/ 21 марта 2012

Я пытаюсь прочитать журнал событий, сохраненный в виде XML-файла из .Net / C #, формат 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-файла журнала событий из этого файла схемы, а затем десериализовать XML с помощью класса XmlSerializer вот так:

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 равен нулю.

Как я могу прочитать журналы событий, сохраненные в формате XML из C #?

1 Ответ

2 голосов
/ 22 марта 2012

Итак, я справился с этим с помощью следующего класса:

[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 # и сравнил / экспериментировал, пока он не заработал.

...