c# - 将数组反序列化为复杂对象

标签 c# .net xml xml-serialization xsd

我的 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 属性的哪些内容吗?

最佳答案

改变:

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

关于c# - 将数组反序列化为复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4792230/

相关文章:

c# - 如何使用 Rhino Mocks 模拟 MEF 导出?

c# - 如果用户在hangman c#中猜测正确,如何显示用户的输入

c# - NetworkStream.DataAvailable 属性在使用 SslStream 时不返回正确的结果

c# - 最小起订量 - 安装方法中的 LINQ 谓词

c# - 确定在不使用 return View(model) 但返回 View ("viewName", model 时返回哪个 ASP.NET MVC View

c# - 将 Rx 与 Prism 的 EventAggregator 一起使用或与其一起使用 - 建议的方法?

java - 使用 XMLEventReader 从子节点解码时出现 IllegalStateException

regex - 通过 XSD 1.0 描述具有不同出现范围的未排序元素组

xml - 一个元素可以同时拥有 id 和 attribute 吗?

c# - 具有自动大小限制管理的 ThreadSafe FIFO 列表