我需要将一个元素夹在另一个元素中。是否可以像这样序列化XML?
这是我的班级
[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>();
}
答案 0 :(得分:1)
您最初表示要在XML文档中序列化一系列元素,如下所示:
<SalesOrderLineRet> </SalesOrderLineRet> <SalesOrderLineGroupRet> </SalesOrderLineGroupRet> <SalesOrderLineRet> </SalesOrderLineRet>
如果与SalesOrderLineRet
和SalesOrderLineGroupRet
对应的类型具有某种公共基本类型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,我不确定您可能需要哪一个。)