簡體   English   中英

XML反序列化

[英]Deserialization of XML

嘗試反序列化XML日志文件。 而且,除了XML Document(0,0)中的Error之外,似乎什么也沒得到。 我猜想這與我的課堂有關,但我似乎找不到解決方案。 我無法更改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>

[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; }
}

反序列化代碼

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

通過從StreamReader切換到FileStream以及對類的更改找到了解決方法。 使用StreamReader時,更改編碼似乎沒有幫助。

我無法重現您看到的問題。 但是, POSLog類存在問題-需要定義如下:

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

您的XML具有根元素<POSLog>其中包含重復序列的<Transaction>元素。 [XmlElement("Transaction")]將數組映射到這樣的一級重復序列。

小提琴的例子。

將班級更改為上述答案

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

以及更改以下StreamReader行

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

對此:

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

修復了root元素遇到的問題,並且我能夠反序列化XML。 感謝dbc的幫助,讓我第一次在論壇上開始解決解決方案!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM