2012-06-28 24 views
7

aşağıdaki xml yapısı alabilirsiniz:Deserialize XML dizesi Hatası Nesne için: xml belgedeki bir hata vardır (1,2) windows olay görüntüleyici itibaren

<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> 

Ben EventData bölümünde sadece ilgileniyorum xml.

public class Event 
    { 
     public EventData EventData; 

    } 

    public class EventData 
    { 
     public String[] Data; 
    } 

Sonra şu kodu kullanın: Aşağıdaki çok basit sınıfları oluşturduk

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

ama kodunun ilk satırında

, aşağıdaki hatayı alıyorum:

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

Bu hata bana bilgilendiricidir. Sorun, sınıflardaki tüm alanlara sahip olmadığımdan veya verileri almak için başka bir sınıfa (XmlSerializer dışında) ihtiyacım var mı? Ben EventData altında verileri istiyorum yolu ... adı ve veri değeri (örn isim1 data1 ile) gereğidir vb

Önemli DÜZENLEME: alıyorum xml ait ToXML() yöntemiyle üretilir EventRecord sınıf

Teşekkür

+2

Eh XML belgesi * * geçerli değil - 'Message' etiketi bakmak:' bazı mesaj '. Bu sizin gerçek XML'iniz değilse, lütfen aynı sorunu gösteren kısa ama eksiksiz bir XML parçası ekleyin. –

+0

@JonSkeet: Xml'yi Olay Kaydı sınıfının –

+0

'unXML() yönteminden alıyorum neden bu yöntem http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventrecord.toxml .aspx kötü xml döndürür –

cevap

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

Bu benim için çalıştı. http://schemas.microsoft.com/win/2004/08/events/event adresinin eklenmesi ve hatanın ortadan kaldırılmasıyla ilgili sorun neydi? –

+0

Hey Markus, EventData altında karmaşık verilerin değerini nasıl öğrenebilirim, sınıfları nasıl tanımlayabilirim? Burada xml bakın: http: // stackoverflow.com/questions/11368636/read-windows-event-veri-dahil-karmaşık-veri- –

3

XmlSerializer genellikle matın ne olduğunu söyler; Özellikle, bazı hata işleme ekleyin: Bunun bir ad konudurtahmin ediyorum

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

; deneyin:

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

Markus önerdi ne önerdi. Teşekkürler Marc –

+0

@Saher yeterince adil, ama gelecekteki iç istisnalar bakmak lütfen - genellikle sorunu açıklamak çok iyi bir iş yapar –