2012-06-28 29 views
7

Từ xem cửa sổ sự kiện tôi có thể nhận được các cấu trúc xml sau:Deserialize chuỗi XML để Object Lỗi: Có một lỗi trong tài liệu 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> 

Tôi chỉ quan tâm đến phần EventData của xml. Tôi đã tạo ra các lớp học rất đơn giản sau đây:

public class Event 
    { 
     public EventData EventData; 

    } 

    public class EventData 
    { 
     public String[] Data; 
    } 

sau đó tôi sử dụng đoạn mã sau:

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

nhưng trên dòng đầu tiên của mã, tôi nhận được lỗi sau:

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

Lỗi này không mang tính thông tin đối với tôi. Là vấn đề mà tôi không có tất cả các lĩnh vực trong các lớp học hoặc tôi cần một số lớp khác (ngoài XmlSerializer) để có được dữ liệu từ. Con đường tôi muốn các dữ liệu dưới EventData là theo tên và giá trị dữ liệu (ví dụ name1 với data1) ... vv

EDIT quan trọng: xml Tôi nhận được tạo ra theo phương pháp ToXML() của các EventRecord lớp

Cảm ơn

+2

Tài liệu XML * không * hợp lệ - hãy xem thẻ 'Message':' một số thông báo '. Nếu đây không phải là XML thực của bạn, vui lòng bao gồm một đoạn XML ngắn nhưng đầy đủ để chứng minh cùng một vấn đề. –

+0

@JonSkeet: Tôi nhận được xml từ toXML() phương thức của lớp Event Record –

+0

tại sao phương thức này http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventrecord.toxml .aspx return bad xml –

Trả lời

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

Điều đó có hiệu quả đối với tôi. vấn đề với việc thêm http://schemas.microsoft.com/win/2004/08/events/event là gì và đã loại bỏ lỗi này. –

+0

Hey Markus, làm thế nào tôi có thể nhận được giá trị của dữ liệu phức tạp trong EventData, làm thế nào để xác định các lớp học? Xem xml tại đây: http: // stackoverflow.com/questions/11368636/reading-windows-event-payload-bao gồm-complex-data –

3

XmlSerializer thường cho bạn biết những gì mờ là; thêm một số xử lý lỗi, cụ thể:

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

Tôi đoán nó là một vấn đề không gian tên; thử:

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

Đề xuất của Markus. Cảm ơn bạn Marc –

+0

@Công bằng đủ, nhưng hãy nhìn vào những ngoại lệ bên trong trong tương lai - nó thường làm một công việc rất tốt để giải thích vấn đề –

Các vấn đề liên quan