2010-08-25 49 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

相關問題