嵌套XML元素 - XML序列化

时间:2016-04-02 16:11:46

标签: c# xml serialization

我需要将一个元素夹在另一个元素中。是否可以像这样序列化XML?

http://pastebin.com/7qDE7Ses

这是我的班级

[XmlRoot(ElementName = "SalesOrderMod")]
public partial class SalesOrderMod
{
    [XmlElementAttribute(Order = 1)]
    public string TxnID { get; set; }
    [XmlElementAttribute(Order = 2)]
    public string EditSequence { get; set; }
    [XmlElementAttribute(Order = 3)]
    public string ShipDate { get; set; }
    [XmlElementAttribute(Order = 4)]
    public ListRef ShipMethodRef = new ListRef();

    public bool ShouldSerializeShipMethodRef()
    {
        return !(String.IsNullOrEmpty(ShipMethodRef.FullName));
    }

    [XmlElementAttribute(Order = 5)]
    public string Other { get; set; }

    [XmlElementAttribute(Order = 6, ElementName = "SalesOrderLineMod")]
    public List<LineMod> SalesOrderLineMod = new List<LineMod>();

    [XmlElementAttribute(Order = 7, ElementName = "SalesOrderLineGroupMod")]
    public List<LineMod> SalesOrderLineGroupMod = new List<LineMod>();
}

1 个答案:

答案 0 :(得分:1)

您最初表示要在XML文档中序列化一系列元素,如下所示:

<SalesOrderLineRet>
</SalesOrderLineRet>
<SalesOrderLineGroupRet>
</SalesOrderLineGroupRet>
<SalesOrderLineRet>
</SalesOrderLineRet>

如果与SalesOrderLineRetSalesOrderLineGroupRet对应的类型具有某种公共基本类型T,则可以将它们存储在List<T>中。例如,以下类定义:

public abstract class SalesOrderLineRetBase
{
}

public class SalesOrderLineRet : SalesOrderLineRetBase
{
}

public class SalesOrderLineGroupRet : SalesOrderLineRetBase
{
}

public class RootObject
{
    [XmlElement(typeof(SalesOrderLineRetBase))]
    [XmlElement(typeof(SalesOrderLineRet))]
    [XmlElement(typeof(SalesOrderLineGroupRet))]
    public List<SalesOrderLineRetBase> SalesOrders { get; set; }
}

序列化后,会生成以下XML:

<RootObject>
    <SalesOrderLineRet />
    <SalesOrderLineGroupRet />
</RootObject>

使用[XmlElement(typeof(T))]告诉XmlSerializer列表应该序列化而没有外部容器元素,并且可以在列表中找到类型T的项目。 必须对每个将存储在列表中的类型[XmlElement(typeof(T))]应用T

(如果列表中的类型没有其他更多的派生基类型,您可以使用List<object>,但我不建议这样做。我建议将特定类型的列表条目分组到特定的基础类型。)

如果您希望使用外部容器元素序列化列表,可以使用[XmlArray][XmlArrayItem(typeof(T))]

public abstract class SalesOrderLineRetBase
{
}

public class SalesOrderLineRet : SalesOrderLineRetBase
{
}

public class SalesOrderLineGroupRet : SalesOrderLineRetBase
{
}

public class RootObject
{
    [XmlArray("SalesOrders")]
    [XmlArrayItem(typeof(SalesOrderLineRetBase))]
    [XmlArrayItem(typeof(SalesOrderLineRet))]
    [XmlArrayItem(typeof(SalesOrderLineGroupRet))]
    public List<SalesOrderLineRetBase> SalesOrders { get; set; }
}

产生以下XML:

<RootObject>
    <SalesOrders>
        <SalesOrderLineRet />
        <SalesOrderLineGroupRet />
    </SalesOrders>
</RootObject>

您必须对将存储在列表中的每种类型[XmlArrayItem(typeof(T))]应用T

(由于您不在问题中包含相关的类和XML,我不确定您可能需要哪一个。)