2010-07-21 11 views
44

voglio XML nel seguente formato:mediante l'attributo XmlArrayItem senza XmlArray su Serializable classe C#

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

Sto cercando di creare una classe Configuration che ha l'attributo [Serializable]. Per serializzare i nodi credenziali, ho il seguente:

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

Tuttavia, quando ho serializzare questo per XML, XML è nel seguente formato:

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

Se rimuovo la linea [XmlArray("configuration")], ho ottenere i seguenti:

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

Come posso serializzare questo il modo in cui voglio, con più <credentials> nodi all'interno del nodo un'unica radice <configuration> ? Volevo farlo senza dover implementare IXmlSerializable e fare serializzazione personalizzata. Ecco come viene descritta la mia classe:

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

risposta

67

Quanto segue deve essere serializzato correttamente come desiderato. L'indizio è [XmlElement("credentials")] sulla lista. Ho fatto questo prendendo il tuo xml, generando uno schema (xsd) da esso in Visual Studio. Quindi eseguire xsd.exe sullo schema per generare una classe. (e alcune piccole modifiche)

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(); 
    } 
} 

danno il seguente output

<?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

Yep, che ha funzionato! Ero così impostato su "è un' Elenco', devo usare l'attributo 'XmlArrayItem' da qualche parte" che non ho nemmeno pensato di renderlo un normale 'XmlElement'. –

+2

buona risposta, ho avuto lo stesso problema - ho voluto rimuovere: risolto con: [XmlElement ("dataitem")] Lista pubblico dataitem {get; impostato; } – nologo

+0

Grazie Mikael. Questo mi ha aiutato con il mio problema oggi. +1 – John

Problemi correlati