簡體   English   中英

使用重復元素反序列化XML

[英]Deserialize XML with repeating elements

這是VS2012中的C#,針對.NET 4.5構建

我是XML序列化/反序列化的新手,並試圖弄清楚這一點。 我有XML

<?xml version="1.0"?>
<AvailabilityResponse>
  <ApiKey>LZ6c@3O9#tq*BAyX4KGYBsCgZ*HpUDtrB*XI*WGLw</ApiKey>
  <ResellerId>101</ResellerId>
  <SupplierId>1004</SupplierId>
  <ForeignReference>1234567890</ForeignReference>
  <Timestamp>2015-08-06T05:20:49.000Z</Timestamp>
  <RequestStatus>
      <Status>SUCCESS</Status>
  </RequestStatus>
  <TTAsku>dcnt</TTAsku>
  <TourAvailability>
      <TourDate>2015-08-31</TourDate>
      <TourOptions>
          <DepartureTime>07:30 PM</DepartureTime>
      </TourOptions>
      <AvailabilityStatus>
          <Status>AVAILABLE</Status>
      </AvailabilityStatus>
  </TourAvailability>
  <TourAvailability>
      <TourDate>2015-08-31</TourDate>
      <TourOptions>
          <DepartureTime>08:30 PM</DepartureTime>
      </TourOptions>
      <AvailabilityStatus>
          <Status>AVAILABLE</Status>
      </AvailabilityStatus>
  </TourAvailability>
</AvailabilityResponse>

我正在嘗試反序列化為此類結構:

[Serializable]
public class AvailabilityResponse
{
    public string ApiKey { get; set; }
    public string ResellerId { get; set; }
    public string SupplierId { get; set; }
    public string ForeignReference { get; set; }
    public DateTime Timestamp { get; set; }
    public RequestStatus RequestStatus { get; set; }
    public string TTAsku { get; set; }
    public TourAvailability[] TourAvailability { get; set; }
}

[Serializable]
public class RequestStatus
{
    public string Status { get; set; }
}

[Serializable]
public class TourAvailability
{
    public DateTime TourDate { get; set; }
    public TourOptions TourOptions { get; set; }
    public AvailabilityStatus AvailabilityStatus { get; set; }
}
[Serializable]
public class AvailabilityStatus
{
    public string Status { get; set; }
    public string UnavailabilityReason { get; set; }
}

我這樣做是:

public static AvailabilityResponse DeserializeAvailabilityResponse(Stream replyStream)
{
    XmlSerializer xmlSr = null;
    XmlReader inreader = null;

    if (replyStream != null)
    {
        XmlTextReader xmlreader = new XmlTextReader(replyStream);
        XmlDocument respXml = new XmlDocument();
        respXml.Load(xmlreader);
        xmlreader.Close();

        xmlSr = DeserializeXmlDoc(respXml, out inreader, typeof(AvailabilityResponse));
    }

    if (xmlSr != null && inreader != null)
    {
        AvailabilityResponse inventory = (AvailabilityResponse)xmlSr.Deserialize(inreader);
        return inventory;
    }
    return null;
}

問題是,當我檢查退回的庫存物品時, TourAvailability如下所示:
在此處輸入圖片說明
例如,我希望它像RequestStatus一樣,用[+]允許我打開它並查看每個元素。 即使我陳述錯了,我也希望至少有一個TourAvailability,而不是零。

我可能在這里錯過了幾件事,但是您能提供的任何幫助將不勝感激。 我還有很多這類事情要處理,因為我們公司的方向稍有改變。

只需使用[XmlElement("TourAvailability")]屬性,即可看到數組的元素。

public class AvailabilityResponse
{
    public string ApiKey { get; set; }
    public string ResellerId { get; set; }
    public string SupplierId { get; set; }
    public string ForeignReference { get; set; }
    public DateTime Timestamp { get; set; }
    public RequestStatus RequestStatus { get; set; }
    public string TTAsku { get; set; }
    [XmlElement("TourAvailability")]
    public TourAvailability[] TourAvailability { get; set; }
}

順便說一句:您不需要那些[Serializable]屬性

PS:反序列化代碼可以簡化為:

using (var f = File.OpenRead(filename))
{
    XmlSerializer ser = new XmlSerializer(typeof(AvailabilityResponse));
    var resp = (AvailabilityResponse)ser.Deserialize();
}

嘗試這個

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Globalization;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Stream stream = File.Open(FILENAME, FileMode.Open);
            AvailabilityResponse availabilityResponse = DeserializeAvailabilityResponse(stream);
        }
        public static AvailabilityResponse DeserializeAvailabilityResponse(Stream replyStream)
        {
            AvailabilityResponse availabilityResponse = null;
            XmlReader inreader = null;

            if (replyStream != null)
            {
                XmlSerializer xs = new XmlSerializer(typeof(AvailabilityResponse));
                inreader = new XmlTextReader(replyStream);
                availabilityResponse = (AvailabilityResponse)xs.Deserialize(inreader);
                return availabilityResponse;
            }
            else
            {
                return null;
            }
        }

    }
    [XmlRoot("AvailabilityResponse")]
    public class AvailabilityResponse
    {
        [XmlElement("ApiKey")]
        public string ApiKey { get; set; }
        [XmlElement("ResellerId")]
        public int ResellerId { get; set; }
        [XmlElement("SupplierId")]
        public int SupplierId { get; set; }
        [XmlElement("ForeignReference")]
        public string ForeignReference { get; set; }
        [XmlElement("Timestamp")]
        public DateTime Timestamp { get; set; }
        [XmlElement("RequestStatus")]
        public RequestStatus RequestStatus { get; set; }
        [XmlElement("TTAsku")]
        public string TTAsku { get; set; }
        [XmlElement("TourAvailability")]
        public List<TourAvailability> TourAvailability { get; set; }
    }

    [XmlRoot("RequestStatus")]
    public class RequestStatus
    {
        [XmlElement("Status")]
        public string Status { get; set; }
    }

    [XmlRoot("TourAvailability")]
    public class TourAvailability
    {
        [XmlElement("TourDate")]
        public DateTime TourDate { get; set; }
        [XmlElement("TourOptions")]
        public TourOptions TourOptions { get; set; }
        [XmlElement("AvailabilityStatus")]
        public AvailabilityStatus AvailabilityStatus { get; set; }
    }
    [XmlRoot("TourOptions")]
    public class TourOptions
    {
        public DateTime dTime { get; set; }


        [XmlElement("DepartureTime")]
        public string DepartureTime
        {
            get
            {
                return this.dTime.ToString("hh:mm tt");
            }
            set
            {
                this.dTime = DateTime.ParseExact(value, "hh:mm tt", CultureInfo.InvariantCulture);
            }
        }


    }

    [XmlRoot("AvailabilityStatus")]
    public class AvailabilityStatus
    {
        [XmlElement("Status")]
        public string Status { get; set; }
        [XmlElement("UnavailabilityReason")]
        public string UnavailabilityReason { get; set; }
    }
}
​

暫無
暫無

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

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