【问题标题】:Deserialize array into complex object将数组反序列化为复杂对象
【发布时间】:2011-01-25 10:15:24
【问题描述】:

我的 XML 消息如下所示:

<msg>
    <reply userid="sales" requestid="2" index="1" pagesize="1000" total="1" type="order">
        <order id="12db8625cd4-000" owner="sales">
            <qty size="1" working="0"/>
            <price limit="0.0"/>
        </order>            
        <order id="12db8636344-000" owner="sales">
            <qty size="1000" working="0"/>
            <price limit="0.0"/>
        </order>
    </reply>
</msg>

如何定义 Order 对象以从回复数组中读取?我的对象看起来像:

[XmlRootAttribute("reply")]
public class MessageReply
{
    [XmlAttribute("userid")]
    public string UserId { get; set; }

    [XmlAttribute("requestid")]
    public string RequestId { get; set; }

    [XmlAttribute("type")]
    public string Type { get; set; }

    [XmlArrayItem(typeof(Order))]
    public List<Order> Orders { get; set; }
}

[XmlRootAttribute("order")]
public class Order
{
    [XmlAttribute("id")]
    public string Id { get; set; }
    [XmlAttribute("owner")]
    public string Owner { get; set;}
    [XmlAttribute("assignee")]
    public string Assignee { get; set; }
    [XmlAttribute("instrumentid")]
    public string InstrumentId { get; set; }
    [XmlAttribute("side")]
    public string Side { get; set;}
    [XmlAttribute("type")]
    public string Type { get; set; }
}

在我的例子中,订单应该在一个单独的元素标签 Orders 中。我想从回复元素中读取它们。您知道要更改我的对象 XML 属性吗?

【问题讨论】:

    标签: c# .net xml xml-serialization xsd


    【解决方案1】:

    变化:

    [XmlArrayItem(typeof(Order))]
    public List<Order> Orders { get; set; }
    

    到:

    [XmlElement("order")]
    public List<Order> Orders { get; set; }
    

    嗯...严格来说我倾向于(我不喜欢可设置的列表)使用:

    private List<Order> orders;
    [XmlElement("order")]
    public List<Order> Orders {get{ return orders ?? (orders = new List<Order>());}}
    

    你还需要一个不同的根对象:

    [XmlRoot("msg")]
    public class Message
    {
        [XmlElement("reply")]
        public MessageReply Reply { get; set; }
    }
    

    然后这个工作:

    var ser = new XmlSerializer(typeof(Message));
    MessageReply reply;
    using(var reader = new StringReader(xml))
    {
        reply = ((Message)ser.Deserialize(reader)).Reply;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      相关资源
      最近更新 更多