2012-02-17 80 views
1

假設我有下面的類結構:的Xml序列化數組自定義標籤名稱

[XmlInclude(typeof(CustomNode))] 
[XmlInclude(typeof(CustomNode2))] 
[XmlRoot("node")] 
class Node 
{ 
    [XmlElement("node")] 
    public Node[] Children { get; set; } 
} 
[XmlRoot("custom-node")] 
class CustomNode : Node { } 
[XmlRoot("custom-node-2")] 
class CustomNode2 : Node { } 

的創建以下結構:

var root = new Node { Children = new Node[2] }; 
root.Children[0] = new CustomNode(); 
root.Children[1] = new CustomNode2(); 

當我的XML序列化這個結構,我得到以下輸出:

<node> 
    <node xsi:Type="CustomNode"/> 
    <node xsi:Type="CustomNode2"/> 
</node> 

但我想看到(並能夠正確加載)somethi ng像這樣:

<node> 
    <custom-node/> 
    <custom-node-2/> 
</node> 

XmlSerializer可以嗎?整個問題是因爲我打算手動創建源xml,並試圖讓它更人性化和友好。

回答

4

,我發現你的問題的解決方案是幾乎你所需要的:

[XmlRoot(ElementName = "node")] 
    public class Node 
    { 
    [XmlArrayItem(typeof(CustomNode), ElementName = "custom-node")] 
    [XmlArrayItem(typeof(CustomNode2), ElementName = "custom-node-2")] 
    public List<Node> Children { get; set; }  
    } 
    [XmlRoot(ElementName = "custom-node")] 
    public class CustomNode : Node { } 
    [XmlRoot(ElementName = "custom-node-2")] 
    public class CustomNode2 : Node { } 

結果:

<node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Children> 
    <custom-node /> 
    <custom-node-2 /> 
    </Children> 
</node> 

希望有點幫助。

+0

你說得對,沒有這些XmlInclude屬性,我的示例將不起作用。但是這不會改變序列化的輸出。 – 2012-02-17 13:01:45

+0

我編輯了我的答案。檢查是否可以幫助你。 – BlueM 2012-02-17 13:50:38

+0

謝謝!那是我需要的。我只將XmlArrayItem更改爲XmlElement,因爲我不想在它們周圍有容器。但無論如何,這工作正常。 – 2012-02-17 14:09:40

0

我不認爲你會說服XmlSerializer輸出這個XML,如果你只使用各種XML屬性來指定XML。

如果類型本身不在根目錄下(而不是在另一個類中組成),則您試圖使用的[XmlRoot]屬性將被忽略。

但是,您可以實現IXmlSerializable接口並提供IXmlSerializable.WriteXml的實現,如果存在XmlSerializer將調用該接口。

這將允許你製作你想要的xml直接到XmlWriter

如果您還需要反序列化,則還需要提供IXmlSerializable.ReadXml的等效實現。

+0

這似乎使得使用XmlSerializer變得毫無意義。我可以自己編寫自定義的序列化/反序列化代碼。 – 2012-02-17 13:14:21

+0

並不是真的 - 假設你有一個完整的對象圖,並且圖中間只有一個你想改變的行爲。使用這種方法,您可以爲圖表中的所有其他類型保留默認序列化,並覆蓋需要自定義的類型。如果您只是在不使用「IXmlSerializable」的情況下編寫一些自定義的東西,那麼您必須爲圖中的任何對象編寫自定義實現。 – 2012-02-17 13:28:22