2012-06-28 11 views
7

Windowsイベントビューアから、私は、次のXML構造を得ることができます。逆シリアル化XML文字列: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> 

を私はのEventDataのセクションにのみ興味を持っていますXML。

public class Event 
    { 
     public EventData EventData; 

    } 

    public class EventData 
    { 
     public String[] Data; 
    } 

私は、次のコードを使用します:私は、次の非常に単純なクラスを作成しました

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

が、コードの最初の行に

、私は次のエラーを取得:

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

このエラーは私には有益ではありません。問題は私がクラス内のすべてのフィールドを持っていないか、またはデータを取得するために他のクラス(XmlSerializer以外)が必要かどうかです。私はEventDataの下のデータをご希望の方法は、名前とデータ値である(例えばNAME1 DATA1と)...など

重要EDIT: 私は取得していますXMLはのToXML()方法によって生成されますEventRecordクラス

おかげ

+2

まあ、XML文書の*は*有効ではありません - 'message'でタグを見て:' いくつかのメッセージ '。これがあなたの本当のXMLでない場合は、同じ問題を示すXMLの短い完全な部分を含めてください。 –

+0

@JonSkeet:イベントレコードクラスのtoXML()メソッドからxmlを取得しています –

+0

なぜこのメソッドhttp://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventrecord.toxml .aspxは悪いxmlを返します –

答えて

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

それは私のために働いた。 http://schemas.microsoft.com/win/2004/08/events/eventを追加することで何が問題になり、エラーを取り除いたのですか? –

+0

Hey Markus、EventDataの下でどのように複雑なデータの価値を得ることができますか、クラスの定義方法は?こちらのXML:http:// stackoverflowを参照してください。com/questions/11368636/reading-windows-event-payload-complex-data –

3

XmlSerializerは、マットが何であるかをよく伝えます。具体的には、いくつかのエラー処理を追加します。

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

私はそれが名前空間の問題であるを推測です。試してみてください。

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

Markusが提案したものありがとうございますMarc –

+0

@Saherかなり公正ですが、将来は内部の例外を見てください - 通常、問題を説明する非常に良い仕事をします –