我目前正试图在C#中反序列化以下XML文件。
问题是,应该包含订单位置的第二个list TraceLinkOrder没有被正确反序列化。
<?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>父类
[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; }
}订单
[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; }
}订购线
[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类添加一个属性,如下所示:
[XmlArrayItem("TracelinkOrderLine", Namespace = "urn:microsoft-dynamics-nav/xmlports/x50020")]
public List<TraceLinkOrderLine> OrderLines { get; set; }不幸的是,这个列表总是空的。
我的另一个想法是让TraceLinkOrder扩展List<TraceLinkOrderLine>,但这也不起作用。
[XmlRoot("TracelinkOrder")]
public class TraceLinkOrder : List<TraceLinkOrderLine>当我这样做时,CarismaOrders列表是空的。
如何在仍然能够访问元素TraceLinkOrder和TraceLinkOrderLine的所有属性的情况下反序列化这个XML文件?
发布于 2018-07-14 06:37:52
正如jdweng在我的问题的注释中所指出的,诀窍是使用XmlElement属性而不是XmlArrayItem。这将告诉C#接受该名称的所有元素,并与它们一起形成一个列表。
TraceLinkOrder类的最终代码如下所示:
[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; }
}https://stackoverflow.com/questions/51302116
复制相似问题