2012-06-28 12 views
7

Von Windows-Ereignisanzeige kann ich die folgende XML-Struktur erhalten:Deserialize XML-String-Fehler Objekt: Es ist ein Fehler in XML-Dokument (1,2)

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
<System> 
    <Provider Name="XXXXXXXXXX" Guid="{YYYYYYYY}" /> 
    <EventID>XYZ</EventID> 
    <Version>0</Version> 
    <Level>L</Level> 
    <Task>A</Task> 
    <Opcode>0</Opcode> 
    <Keywords>0x000xyzh</Keywords> 
    <TimeCreated SystemTime="2012-06-28T15:44:04.997837000Z" /> 
    <EventRecordID>153</EventRecordID> 
    <Correlation ActivityID="{DDDDDDDDD}" /> 
    <Execution ProcessID="199999" ThreadID="90990" /> 
    <Channel>Microsoft-Windows-ABCDEFG/Admin</Channel> 
    <Computer>myPC</Computer> 
    <Security UserID="ABCABC" /> 
    </System> 
<EventData> 
    <Data Name="name1">data1</Data> 
    <Data Name="name2">data2</Data> 
    <Data Name="name3">data3</Data> 
</EventData> 
<RenderingInfo Culture="en-US"> 
    <Message>some message </Message> 
    <Level>Information</Level> 
    <Task>XYZ</Task> 
    <Opcode>Info</Opcode> 
    <Channel /> 
    <Provider /> 
    <Keywords> 
    <Keyword>XYZ</Keyword> 
    </Keywords> 
</RenderingInfo> 
</Event> 

ich nur daran interessiert bin in dem Eventdata Abschnitt das XML. Ich habe die folgenden sehr einfachen Klassen erstellt:

public class Event 
    { 
     public EventData EventData; 

    } 

    public class EventData 
    { 
     public String[] Data; 
    } 

ich dann den folgenden Code verwenden:

XmlSerializer serializer = new XmlSerializer(typeof(Event)); 
StringReader reader = new StringReader(evtXml); 
evt = (Event)serializer.Deserialize(reader); 

aber auf der ersten Zeile des Codes, bekomme ich folgende Fehlermeldung:

There is an error in XML document (1, 2).

Dieser Fehler ist für mich nicht informativ. Ist das Problem, dass ich nicht alle Felder in den Klassen habe oder brauche ich eine andere Klasse (außer XmlSerializer), um die Daten abzurufen. Die Art, wie ich die Daten unter dem Eventdata möchte ist mit Namen und Daten Wert (zB name1 mit data1) ... etc

Wichtige EDIT: die xml Ich erhalte durch die ToXML() Verfahren erzeugt die EventRecord Klasse

Dank

+2

Nun das XML-Dokument * nicht * gültig - Blick auf dem 'Message' tag:' einig Nachricht '. Wenn dies nicht Ihr richtiger XML-Code ist, fügen Sie bitte ein kurzes, aber vollständiges XML-Dokument ein, das das gleiche Problem darstellt. –

+0

@JonSkeet: Ich bekomme die xml von toXML() -Methode der Ereignis Record-Klasse –

+0

Warum würde diese Methode http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventrecord.toxml .aspx return bad xml –

Antwort

7
XmlSerializer serializer = new XmlSerializer(typeof(Event), 
     "http://schemas.microsoft.com/win/2004/08/events/event"); 

StringReader reader = new StringReader(evtXml); 
var evt = (Event)serializer.Deserialize(reader); 
public class Event 
{ 
    public Data[] EventData; 
} 

public class Data 
{ 
    [XmlAttribute] 
    public string Name; 

    [XmlText] 
    public string Value; 
} 
+0

Das hat für mich funktioniert. Was war das Problem mit dem Hinzufügen von http://schemas.microsoft.com/win/2004/08/events/event und welche den Fehler beseitigt haben. –

+0

Hey Markus, wie kann ich den Wert komplexer Daten unter EventData bekommen, wie definiere ich die Klassen? Siehe XML hier: http: // stackoverflow.com/questions/11368636/Lese-Windows-Ereignis-Payload-einschließlich-komplexe-Daten –

3

XmlSerializer sagt oft, was die Matte ist; einige Fehlerbehandlung hinzufügen, und zwar:

try { 
    // your code 
} catch(Exception ex) { 
    while(ex != null) { 
     Console.WriteLine(ex.Message); 
     ex = ex.InnerException; 
    } 
} 

ich raten bin es ist ein Namespace-Problem; versuchen:

[XmlRoot("Event", 
    Namespace="http://schemas.microsoft.com/win/2004/08/events/event")] 
public class Event {...} 
+0

Was Markus vorgeschlagen hat gearbeitet. Vielen Dank Marc –

+0

@Saher fair, aber bitte schauen Sie sich die inneren Ausnahmen in der Zukunft an - es macht normalerweise eine sehr gute Arbeit, das Problem zu erklären –