2016-08-05 9 views
1

Der Versuch, eine XML-Protokolldatei zu deserialisieren. Und kann anscheinend nichts als Fehler im XML-Dokument (0,0) bekommen. Ich vermute, es hat etwas mit meiner Klasse zu tun, aber ich kann keine Lösung finden. Ich kann die XML-Formatierung ändern, da dies eine Protokolldatei von einem Server kommt, ist (vereinfacht nur)Deserialisierung von XML

XML

<?xml version="1.0" encoding="utf-8"?> 
<POSLog> 
<Transaction> 
    <RetailStoreID>1</RetailStoreID> 
    <SequenceNumber>2</SequenceNumber> 
</Transaction> 
<Transaction> 
    <RetailStoreID>1</RetailStoreID> 
    <SequenceNumber>3</SequenceNumber> 
</Transaction> 
</POSLog> 

Klasse

[Serializable()] 
public class Transaction 
{ 
    [XmlElement("RetailStoreID")] 
    public string RetailStoreID { get; set; } 

    [XmlElement("SequenceNumber")] 
    public string SequenceNumber { get; set; } 

} 

[Serializable()] 
[XmlRoot("POSLog")] 
public class POSLog 
{ 
    [XmlArray("POSLog")] 
    [XmlArrayItem("Transaction", typeof(Transaction))] 
    public Transaction[] Transaction { get; set; } 
} 

Deserialize Code

POSLog poslog = new POSLog(); 
string path = "POSLog.xml"; 
XmlSerializer serializer = new XmlSerializer(typeof(POSLog)); 
StreamReader reader = new StreamReader(path); 
poslog = (POSLog)serializer.Deserialize(reader); 

gefunden beheben, indem Sie zusammen mit Änderungen an der Klasse von StreamReader zu FileStream wechseln. Das Ändern der Kodierung scheint bei der Verwendung des StreamReader nicht hilfreich zu sein.

+2

1) Sie benötigen Innere Ausnahmen, 2) (offtopic) Sie ein bisschen zu viele Attribute verwenden. –

+1

Zeigen Sie den StackTrace und insbesondere die gesamte Ausnahme (die innere Ausnahme). – HimBromBeere

+2

Da der Fehler bei (0,0) liegt, was das erste Zeichen der ersten Zeile bedeutet, vermute ich, dass Ihre XML-Datei mit UTF mit einer Byte-Reihenfolge-Marke codiert wurde. Versuchen Sie, Ihrem StreamReader eine Codierung hinzuzufügen. –

Antwort

3

Ich kann das Problem, das Sie sehen, nicht reproduzieren. Allerdings gibt es ein Problem mit der POSLog Klasse - es muss definiert werden, wie folgt:

[Serializable()] 
[XmlRoot("POSLog")] 
public class POSLog 
{ 
    [XmlElement("Transaction")] 
    public Transaction[] Transaction { get; set; } 
} 

Ihr XML ein Wurzelelement hat <POSLog> eine sich wiederholende Sequenz von <Transaction> Elemente enthält. [XmlElement("Transaction")] ordnet das Array einer solchen einstufigen Wiederholungssequenz zu.

Beispiel fiddle.

1

Ändern der Klasse auf die Folge oben Antwort

[Serializable()] 
[XmlRoot("POSLog")] 
public class POSLog 
{ 
    [XmlElement("Transaction")] 
    public Transaction[] Transaction { get; set; } 
} 

Zusammen mit dem Ändern der folgenden Stream Linien

StreamReader reader = new StreamReader(path); 
poslog = (POSLog)serializer.Deserialize(reader); 

Um dies:

FileStream fs = new FileStream(path, FileMode.Open); 
poslog = (POSLog)serializer.Deserialize(fs); 

das Problem behoben, ich hatte mit Das Root-Element und ich konnten das XML deserialisieren. Danke an dbc für die Hilfe, damit ich zum ersten Mal eine Lösung in einem Forum lösen kann!

Verwandte Themen