2010-07-21 106 views
44

我要在以下格式的XML:不XmlArray使用XmlArrayItem屬性的序列化的C#類

<configuration><!-- Only one configuration node --> 
    <logging>...</logging><!-- Only one logging node --> 
    <credentials>...</credentials><!-- One or more credentials nodes --> 
    <credentials>...</credentials> 
</configuration> 

我試圖創建一個類Configuration具有[Serializable]屬性。序列化憑證的節點,我有以下幾點:

[XmlArray("configuration")] 
[XmlArrayItem("credentials", typeof(CredentialsSection))] 
public List<CredentialsSection> Credentials { get; set; } 

然而,當我序列這對XML的XML是按以下格式:

<configuration> 
    <logging>...</logging> 
    <configuration><!-- Don't want credentials nodes nested in a second 
         configuration node --> 
    <credentials>...</credentials> 
    <credentials>...</credentials> 
    </configuration> 
</configuration> 

如果我刪除了[XmlArray("configuration")]行,我得到如下:

<configuration> 
    <logging>...</logging> 
    <Credentials><!-- Don't want credentials nodes nested in Credentials node --> 
    <credentials>...</credentials> 
    <credentials>...</credentials> 
    </Credentials> 
</configuration> 

我如何序列化此我想要的方式,與多個<credentials>節點的單個根節點<configuration>內?我想這樣做,而不必執行IXmlSerializable並執行自定義序列化。這是我的班級的描述:

[Serializable] 
[XmlRoot("configuration")] 
public class Configuration : IEquatable<Configuration> 

回答

67

以下內容應該按照您想要的方式正確序列化。列表上的線索是[XmlElement("credentials")]。我通過使用xml來實現這一點,在Visual Studio中從它生成一個模式(xsd)。然後在模式上運行xsd.exe以生成一個類。 (和一些小的修改)

public class CredentialsSection 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
} 

[XmlRoot(Namespace = "", IsNullable = false)] 
public class configuration 
{ 
    /// <remarks/> 
    public string logging { get; set; } 

    /// <remarks/> 
    [XmlElement("credentials")] 
    public List<CredentialsSection> credentials { get; set; } 

    public string Serialize() 
    { 
     var credentialsSection = new CredentialsSection {Username = "a", Password = "b"}; 
     this.credentials = new List<CredentialsSection> {credentialsSection, credentialsSection}; 
     this.logging = "log this"; 
     XmlSerializer s = new XmlSerializer(this.GetType()); 
     StringBuilder sb = new StringBuilder(); 
     TextWriter w = new StringWriter(sb); 
     s.Serialize(w, this); 
     w.Flush(); 
     return sb.ToString(); 
    } 
} 

給下面的輸出

<?xml version="1.0" encoding="utf-16"?> 
<configuration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <logging>log this</logging> 
    <credentials> 
    <Username>a</Username> 
    <Password>b</Password> 
    </credentials> 
    <credentials> 
    <Username>a</Username> 
    <Password>b</Password> 
    </credentials> 
</configuration> 
+2

是的,這工作!我是這樣設置的「它是一個List」,必須使用'XmlArrayItem'屬性「,我甚至沒有想到將它定義爲一個常規的'XmlElement'。 – 2010-07-21 20:22:45

+2

很好的答案,我有同樣的問題 - 我想刪除: 與解決它: [的XmlElement( 「DataItem的」) 公開名單的DataItem {獲得;組; } – nologo 2011-06-23 11:04:31

+0

感謝Mikael。這幫助我解決了今天的問題。 +1 – John 2011-10-31 19:10:28