2012-06-28 14 views
7

Od widza zdarzeń systemu Windows można uzyskać następującą strukturę XML:Cofnięcie XML ciąg do obiektu błędu: Wystąpił błąd w dokumencie XML (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> 

jestem zainteresowany tylko w sekcji EVENTDATA z xml. I zostały utworzone następujące bardzo proste klasy:

public class Event 
    { 
     public EventData EventData; 

    } 

    public class EventData 
    { 
     public String[] Data; 
    } 

I wtedy użyć następującego kodu:

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

ale na pierwszej linii kodu, pojawia się następujący błąd:

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

Ten błąd nie jest dla mnie informacyjny. Czy problem polega na tym, że nie mam wszystkich pól w klasach, czy też potrzebuję jakiejś innej klasy (innej niż XmlSerializer), aby uzyskać dane. Sposób Chciałbym dane pod EVENTDATA jest wg nazwy i wartości danych (np nazwa1 z danych1) ... itd

Ważne EDIT: xml jestem coraz generowany jest metodą ToXML() że EventRecord klasy

Dzięki

+2

Dobrze dokument XML * * nie jest ważne - spojrzeć na 'tagu message':' niektóre wiadomość '. Jeśli to nie jest Twój prawdziwy XML, dołącz krótki, ale kompletny fragment XML, który pokazuje ten sam problem. –

+0

@JonSkeet: Dostaję xml od toXML() klasy Event Record class –

+0

dlaczego ta metoda http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventrecord.toxml .aspx return bad xml –

Odpowiedz

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

To zadziałało dla mnie. jaki był problem z dodaniem http://schemas.microsoft.com/win/2004/08/events/event i który pozbył się błędu. –

+0

Hej Markus, jak mogę uzyskać wartość złożonych danych w EventData, jak zdefiniować klasy? Zobacz xml tutaj: http: // stackoverflow.com/questions/11368636/reading-windows-event-payload-including-complex-data –

3

XmlSerializer często mówi ci, czym jest matowy; dodać obsługę błędów, w szczególności:

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

mam zgadywania jest to kwestia nazw; spróbuj:

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

To, co zasugerował Markus. Dziękuję Marc –

+0

@Wystarczy, ale proszę spojrzeć na wewnętrzne wyjątki w przyszłości - zazwyczaj bardzo dobrze wyjaśnia się problem –