首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有属性的嵌套列表的反序列化

具有属性的嵌套列表的反序列化
EN

Stack Overflow用户
提问于 2018-07-12 09:34:38
回答 1查看 37关注 0票数 0

我目前正试图在C#中反序列化以下XML文件。

问题是,应该包含订单位置的第二个list TraceLinkOrder没有被正确反序列化。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<tli:AddTracelinkOrders xmlns:tli="urn:microsoft-dynamics-schemas/codeunit/CarismaIntegration" xmlns:x50="urn:microsoft-dynamics-nav/xmlports/x50020">
 <tli:carismaOrders>
  <x50:TracelinkOrder DocType="0" Annulation="false" TROrderType="1" Department="08">
   <x50:TracelinkOrderLine NetValue="42.00" AccountNo="100206" LineNo="10000"/>
   <x50:TracelinkOrderLine NetValue="259.17" AccountNo="100306" LineNo="20000"/>
   <x50:TracelinkOrderLine NetValue="385.80" AccountNo="100406" LineNo="30000"/>
  </x50:TracelinkOrder>
  <x50:TracelinkOrder DocType="1" Annulation="false" TROrderType="1" Department="08">
   <x50:TracelinkOrderLine NetValue="2.10" AccountNo="100206" LineNo="10000"/>
   <x50:TracelinkOrderLine NetValue="25.92" AccountNo="100306" LineNo="20000"/>
  </x50:TracelinkOrder>
 </tli:carismaOrders>
</tli:AddTracelinkOrders>

父类

代码语言:javascript
复制
[XmlRoot("AddTracelinkOrders", Namespace = "urn:microsoft-dynamics-schemas/codeunit/CarismaIntegration")]
public class TraceLinkOrders
{
    [XmlArray("carismaOrders", Namespace = "urn:microsoft-dynamics-schemas/codeunit/CarismaIntegration")]
    [XmlArrayItem("TracelinkOrder", Namespace = "urn:microsoft-dynamics-nav/xmlports/x50020")]
    public List<TraceLinkOrder> CarismaOrders { get; set; }
}

订单

代码语言:javascript
复制
[XmlRoot("TracelinkOrder")]
public class TraceLinkOrder
{
    [XmlAttribute()]
    public Int16 DocType { get; set; }

    [XmlAttribute()]
    public Boolean Annulation { get; set; }

    [XmlAttribute()]
    public Int16 TROrderType { get; set; }

    [XmlAttribute()]
    public Int16 Department { get; set; }
}

订购线

代码语言:javascript
复制
[XmlRoot("TracelinkOrderLine", Namespace = "urn:microsoft-dynamics-nav/xmlports/x50020")]
public class TraceLinkOrderLine
{
    [XmlAttribute()]
    public Decimal NetValue { get; set; }

    [XmlAttribute()]
    public String AccountNo { get; set; }

    [XmlAttribute()]
    public String LineNo { get; set; }
}

order类应该包含一个订单行列表。

我尝试向order类添加一个属性,如下所示:

代码语言:javascript
复制
[XmlArrayItem("TracelinkOrderLine", Namespace = "urn:microsoft-dynamics-nav/xmlports/x50020")]
public List<TraceLinkOrderLine> OrderLines { get; set; }

不幸的是,这个列表总是空的。

我的另一个想法是让TraceLinkOrder扩展List<TraceLinkOrderLine>,但这也不起作用。

代码语言:javascript
复制
[XmlRoot("TracelinkOrder")]
public class TraceLinkOrder : List<TraceLinkOrderLine>

当我这样做时,CarismaOrders列表是空的。

如何在仍然能够访问元素TraceLinkOrderTraceLinkOrderLine的所有属性的情况下反序列化这个XML文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-14 06:37:52

正如jdweng在我的问题的注释中所指出的,诀窍是使用XmlElement属性而不是XmlArrayItem。这将告诉C#接受该名称的所有元素,并与它们一起形成一个列表。

TraceLinkOrder类的最终代码如下所示:

代码语言:javascript
复制
[XmlRoot("TracelinkOrder")]
public class TraceLinkOrder
{
    [XmlAttribute()]
    public Int16 DocType { get; set; }

    [XmlAttribute()]
    public Boolean Annulation { get; set; }

    [XmlAttribute()]
    public Int16 TROrderType { get; set; }

    [XmlAttribute()]
    public Int16 Department { get; set; }

    [XmlElement("TracelinkOrderLine")]
    public List<TraceLinkOrderLine> OrderLines { get; set; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51302116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档