2012-06-28 220 views
7

De visor de sucesos de Windows que puedo conseguir la siguiente estructura XML:cadena XML Deserialize al objeto de error: Hay un error en el documento 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> 

Sólo estoy interesado en la sección de EventData el xml He creado las siguientes clases muy sencillo:

public class Event 
    { 
     public EventData EventData; 

    } 

    public class EventData 
    { 
     public String[] Data; 
    } 

Luego utilizo el siguiente código:

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

pero en la primera línea de código, me sale el siguiente error:

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

Este error no me es informativo. Es el problema de que no tengo todos los campos en las clases o necesito alguna otra clase (aparte de XmlSerializer) para obtener los datos. La forma me gustaría que los datos bajo el EventData es por su nombre y valor de los datos (por ejemplo, nombre1 con datos1) ... etc

EDITAR Importante: el xml que estoy recibiendo es generado por el método de ToXML() los EventRecord clase

Gracias

+2

bien el documento XML * * no es válida - mirar la etiqueta de 'message':' algún mensaje '. Si este no es su XML real, incluya una pieza breve pero completa de XML que demuestre el mismo problema. –

+0

@JonSkeet: Obtengo el xml del método XML de la clase de registro de eventos –

+0

por qué este método http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventrecord.toxml .aspx return bad xml –

Respuesta

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

Eso funcionó para mí. cuál fue el problema al agregar http://schemas.microsoft.com/win/2004/08/events/event y que eliminó el error. –

+0

Hola Markus, ¿cómo puedo obtener valor de los datos complejos en EventData, cómo definir las clases? Ver xml aquí: http: // stackoverflow.com/questions/11368636/reading-windows-event-payload-including-complex-data –

3

XmlSerializer a menudo le dice qué es el mate; añadir un poco de control de errores, específicamente:

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

estoy adivinando se trata de una cuestión de espacio de nombres; Proveedores:

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

Lo que sugirió Markus funcionó. Gracias Marc –

+0

@Saher es justo, pero por favor mira las excepciones internas en el futuro: por lo general, hace un muy buen trabajo al explicar el problema –

Cuestiones relacionadas