【问题标题】:List<T> not deserialize xml in C#List<T> 不在 C# 中反序列化 xml
【发布时间】:2019-06-03 06:21:22
【问题描述】:

我有一个 xml,为了反序列化它,我创建了一个 List&lt;Order&gt; 类型的类。但是当我尝试反序列化它时,下面的代码无法反序列化 XML,并且我没有得到 List&lt;Order&gt; 值。

我正在提供我尝试过的代码,XML 和 XML 类。

代码

XmlSerializer serializer = new XmlSerializer(typeof(ECFindOrderResponse.Envelope));    
                using (TextReader reader = new StringReader(str))
                {
                    if (reader != null)
                    {
                        ECFindOrderResponse.Envelope result = (ECFindOrderResponse.Envelope)serializer.Deserialize(reader);
                        if (result != null && result.Body != null)
                        {

                        }
                    }
                }

我期望的 XML 作为我想要反序列化的响应

 <?xml version="1.0" encoding="UTF-8"?>
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP:Body>
      <m:FindOrderResponse xmlns:m="http://www.courier.com/schemas/">
         <Orders>
            <Order OrderID="9653653" OrderNumber="9653653" Auth="19204071" Service="NAT-Other" AmountCharged="96.39" PodName="Tina Sample" PodDateTime="10/8/2016 10:19:00 AM" OrderDate="10/8/2016">
               <Stops>
                  <Stop Sequence="1" Name="United Airlines" Address="AWB#016-9672-4071" City="LOUISVILLE" State="KY" Zip="40213" DispatchZone="40213" />
                  <Stop Sequence="2" Name="Tina Sample" Address="6300 Aurora Ave" City="Charlestown" State="IN" Zip="47111" DispatchZone="47111" />
               </Stops>
            </Order>
            <Order OrderID="9653653" OrderNumber="9653653" Auth="19204071" Service="NAT-Other" AmountCharged="96.39" PodName="Tina Sample" PodDateTime="10/8/2016 10:19:00 AM" OrderDate="10/8/2016">
               <Stops>
                  <Stop Sequence="1" Name="United Airlines" Address="AWB#016-9672-4071" City="LOUISVILLE" State="KY" Zip="40213" DispatchZone="40213" />
                  <Stop Sequence="2" Name="Tina Sample" Address="6300 Aurora Ave" City="Charlestown" State="IN" Zip="47111" DispatchZone="47111" />
               </Stops>
            </Order>
         </Orders>
      </m:FindOrderResponse>
   </SOAP:Body>
</SOAP:Envelope> 

C# 类文件

public  class ECFindOrderResponse
{
    [XmlRoot(ElementName = "Stop")]
    public class Stop
    {
        [XmlAttribute(AttributeName = "Sequence")]
        public string Sequence { get; set; }
        [XmlAttribute(AttributeName = "Name")]
        public string Name { get; set; }
        [XmlAttribute(AttributeName = "Address")]
        public string Address { get; set; }
        [XmlAttribute(AttributeName = "City")]
        public string City { get; set; }
        [XmlAttribute(AttributeName = "State")]
        public string State { get; set; }
        [XmlAttribute(AttributeName = "Zip")]
        public string Zip { get; set; }
        [XmlAttribute(AttributeName = "DispatchZone")]
        public string DispatchZone { get; set; }
    }

    [XmlRoot(ElementName = "Stops")]
    public class Stops
    {
        [XmlElement(ElementName = "Stop")]
        public List<Stop> Stop { get; set; }
    }

    [XmlRoot(ElementName = "Order")]
    public class Order
    {
        [XmlElement(ElementName = "Stops")]
        public Stops Stops { get; set; }
        [XmlAttribute(AttributeName = "OrderID")]
        public string OrderID { get; set; }
        [XmlAttribute(AttributeName = "OrderNumber")]
        public string OrderNumber { get; set; }
        [XmlAttribute(AttributeName = "Auth")]
        public string Auth { get; set; }
        [XmlAttribute(AttributeName = "Service")]
        public string Service { get; set; }
        [XmlAttribute(AttributeName = "AmountCharged")]
        public string AmountCharged { get; set; }
        [XmlAttribute(AttributeName = "PodName")]
        public string PodName { get; set; }
        [XmlAttribute(AttributeName = "PodDateTime")]
        public string PodDateTime { get; set; }
        [XmlAttribute(AttributeName = "OrderDate")]
        public string OrderDate { get; set; }
    }

    [XmlRoot(ElementName = "Orders")]
    public class Orders
    {
        [XmlElement(ElementName = "Order")]
        public List<Order> Order { get; set; }
    }

    [XmlRoot(ElementName = "FindOrderResponse", Namespace = "http://www.courier.com/schemas/")]
    public class FindOrderResponse
    {
        [XmlElement(ElementName = "Orders")]
        public Orders Orders { get; set; }
        [XmlAttribute(AttributeName = "m", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string M { get; set; }
    }

    [XmlRoot(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class Body
    {
        [XmlElement(ElementName = "FindOrderResponse", Namespace = "http://www.e-courier.com/schemas/")]
        public FindOrderResponse FindOrderResponse { get; set; }
    }

    [XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class Envelope
    {
        [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public Body Body { get; set; }
        [XmlAttribute(AttributeName = "SOAP", Namespace = "http://www.w3.org/2000/xmlns/")]
        public string SOAP { get; set; }
    }
}

【问题讨论】:

  • 不反序列化是什么意思?
  • ECFindOrderResponse 不包含任何属性或字段,因此无需反序列化。你已经声明了一些嵌套类,但那是完全不同的。
  • @ReyanChougle 谢谢,当我将 xml 作为字符串传递时,这将是我的预期响应。这仅返回 Envelope 和 Body 值,但 List 我什么也没得到
  • @JohnWu 谢谢,但如果您查看我已经为订单创建了一个嵌套类,并且在订单中我创建了一个列表
  • 仅仅创建嵌套类什么都不做。您必须有一个 propertyList&lt;Order&gt;

标签: c# xml deserialization


【解决方案1】:

试试这个:

[XmlRoot(ElementName = "FindOrderResponse", Namespace = "http://www.courier.com/schemas/")]
public class FindOrderResponse
{
    [XmlArray("Orders")]
    [XmlArrayItem("Order")]
    public List<Order> Orders { get; set; }
    [XmlAttribute(AttributeName = "m", Namespace = "http://www.w3.org/2000/xmlns/")]
    public string M { get; set; }
}

这里的重要部分是您的代码中缺少的 XmlArrayXmlArrayItem 属性。

【讨论】:

  • (以前编辑过) - 啊,我明白了;你说得对,明确的[XmlElement(ElementName = "Orders")] 是一个问题,但是:这里显示的[XmlArray] / [XmlArrayItem] 是IIRC 隐式的,可以省略,只要删除[XmlElement]
  • @Daniel 在您的建议更改后,我得到 Orders count=0
  • @A.Goutam 您可以尝试使Namespace="" 明确吗?即[XmlArray("Orders", Namespace = "")][XmlArrayItem("Order", Namespace = "")] - 一般而言,选择性粘贴 -> 将 XML 粘贴为类要容易得多(然后整理一下); IDE 建议:[System.Xml.Serialization.XmlArrayAttribute(Namespace = "")][System.Xml.Serialization.XmlArrayItemAttribute("Order", IsNullable = false)](有时很冗长)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2015-10-25
  • 2011-09-28
  • 1970-01-01
  • 2018-10-30
  • 2012-04-06
相关资源
最近更新 更多