2010-08-25 78 views
0

我想创建一个XML输出文件来导入到另一个程序。我得到了看起来像这样的XML文件示例:使用XmlSerializer来创建一个非标准的元素

<SalesOrder> 
    <OrderHeader> 
    <BillTo> 
     <EntityID>1234</EntityID> 
    </BillTo> 
    </OrderHeader> 
    <LineItemList> 
    <OrderLineComment> 
     <LineItemID>1</LineItemID> 
    </OrderLineComment> 
    <LineItem> 
     ... 
    </LineItem> 
    <LineItem> 
     ... 
    </LineItem> 
    <LineItem> 
     ... 
    </LineItem> 
    ... 
    </LineItemList> 
</SalesOrder> 

我有一个C#项目,能够输出使用一个XmlSerializer本部分的除外这种类型的文件:

<LineItemList> 
    <OrderLineComment> 
     <LineItemID>1</LineItemID> 
    </OrderLineComment> 

的LineItemList部分仅仅是一个LineItems的列表,但在LineItemList的开始部分添加了这个不同的元素OrderLineComment。

如果我将它表示为一个LineItems数组,它看起来是相同的,只是它缺少OrderLineComment。如果我代表本作包含OrderLineComment和了LineItem数组的新对象LineItemList,我得到这个:

<LineItemList> 
    <OrderLineComment> 
     <LineItemID>1</LineItemID> 
    </OrderLineComment> 
    <LineItems> 
     <LineItem> 
    ... 
     </LineItem> 
     ... 
    </LineItems> 

其中有我想要的东西,但它包装所有了LineItem与<LineItems>标签,这是不我也想要什么。

所以,我想知道的是:

  1. 有没有办法通过XmlSerializer的做到这一点?如果是这样,怎么样?
  2. 如果没有,并且我必须重写代码以使用XmlSerializer以外的其他代码,那么执行此操作的最佳方法是什么?为什么?

在此先感谢。

回答

2

您可以从一个公共基类OrderLineCommentLineItem得出:

public abstract class LineItemBase 
{ 
    ... 
} 

public class LineItem : LineItemBase 
{ 
    ... 
} 

public class OrderLineComment : LineItemBase 
{ 
    ... 
} 

然后声明LineItemList财产LineItemBase对象的集合,并使用XmlArrayItem属性来指定哪些类型可以包含在集合中:

[XmlArrayItem(typeof(LineItem))] 
[XmlArrayItem(typeof(OrderLineComment))] 
public List<LineItemBase> LineItemList { get; set; } 

这应该达到你想要的

+0

像一个魅力工作 - 谢谢。 – Whisker 2010-08-25 16:15:25

1

您可以随时在您的类型上实施IXmlSerializable界面。它允许任何复杂的序列化,并且它可以与XmlSerializer一起使用。

编辑:

这里,如果你想通过标准属性来实现它的生成代码的例子。我从你的xml创建了xsd,并用XSD.exe生成了代码。

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class SalesOrder { 

    private OrderHeader orderHeaderField; 

    private LineItemList lineItemListField; 

    /// <remarks/> 
    public OrderHeader OrderHeader { 
     get { 
      return this.orderHeaderField; 
     } 
     set { 
      this.orderHeaderField = value; 
     } 
    } 

    /// <remarks/> 
    public LineItemList LineItemList { 
     get { 
      return this.lineItemListField; 
     } 
     set { 
      this.lineItemListField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class OrderHeader { 

    private BillTo billToField; 

    /// <remarks/> 
    public BillTo BillTo { 
     get { 
      return this.billToField; 
     } 
     set { 
      this.billToField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class BillTo { 

    private short entityIDField; 

    /// <remarks/> 
    public short EntityID { 
     get { 
      return this.entityIDField; 
     } 
     set { 
      this.entityIDField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class LineItemList { 

    private OrderLineComment orderLineCommentField; 

    private string[] lineItemField; 

    /// <remarks/> 
    public OrderLineComment OrderLineComment { 
     get { 
      return this.orderLineCommentField; 
     } 
     set { 
      this.orderLineCommentField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("LineItem")] 
    public string[] LineItem { 
     get { 
      return this.lineItemField; 
     } 
     set { 
      this.lineItemField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class OrderLineComment { 

    private sbyte lineItemIDField; 

    /// <remarks/> 
    public sbyte LineItemID { 
     get { 
      return this.lineItemIDField; 
     } 
     set { 
      this.lineItemIDField = value; 
     } 
    } 
} 
+0

upvoted,因为在开始尝试这个之后,显然它会实现我期待的结果,这只是基类解决方案更快更轻松。尽管非常感谢你的回答。 – Whisker 2010-08-25 16:16:23

相关问题