2010-07-21 4 views
44

Je veux XML dans le format suivant:utilisant l'attribut XmlArrayItem sans XmlArray sur Serializable classe C#

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

Je suis en train de créer une classe Configuration qui a l'attribut [Serializable]. Pour sérialiser les informations d'identification des noeuds, je donne les résultats suivants:

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

Cependant, quand je sérialisez à XML, le XML est dans le format suivant:

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

Si je supprime la ligne [XmlArray("configuration")], je obtenir ce qui suit:

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

Comment puis-je sérialiser la façon dont je veux, avec plusieurs <credentials> nœuds dans le nœud racine unique <configuration> ? Je voulais faire cela sans avoir à mettre en œuvre IXmlSerializable et faire une sérialisation personnalisée. Voici comment ma classe est décrite:

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

Répondre

67

La suite devrait sérialiser correctement comme vous le souhaitez. L'indice étant [XmlElement("credentials")] sur la liste. Je l'ai fait en prenant votre xml, générant un schéma (xsd) à partir de lui dans Visual Studio. Puis, exécutez xsd.exe sur le schéma pour générer une classe. (et quelques petites modifications)

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

donnent le résultat suivant

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

Oui, cela a fonctionné! J'étais tellement sur "c'est une liste", je dois utiliser l'attribut 'XmlArrayItem' quelque part" que je n'ai même pas pensé à en faire un 'XmlElement' normal. –

+2

bonne réponse, j'ai eu le même problème - je voulais supprimer: résolu avec: [XmlElement ("DataItem")] Liste publique DataItem {get; ensemble; } – nologo

+0

Merci Mikael. Cela m'a aidé avec mon problème aujourd'hui. +1 – John

Questions connexes