Comment décorer/définir les membres de la classe facultative de l'élément XML pour être utilisé avec XmlSerializer?
J'ai le texte suivant de la structure XML. Le theElement
élément peut contenir theOptionalList
élément, ou pas:
<theElement attrOne="valueOne" attrTwo="valueTwo">
<theOptionalList>
<theListItem attrA="valueA" />
<theListItem attrA="anotherValue" />
<theListItem attrA="stillAnother" />
</theOptionalList>
</theElement>
<theElement attrOne="anotherOne" attrTwo="anotherTwo" />
Ce qui est un moyen propre à exprimer le correspondant de la structure de la classe?
Je suis assez sûr de l'suivantes:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace MyNamespace
{
public class TheOptionalList
{
[XmlAttributeAttribute("attrOne")]
public string AttrOne { get; set; }
[XmlAttributeAttribute("attrTwo")]
public string AttrTwo { get; set; }
[XmlArrayItem("theListItem", typeof(TheListItem))]
public TheListItem[] theListItems{ get; set; }
public override string ToString()
{
StringBuilder outText = new StringBuilder();
outText.Append("attrOne = " + AttrOne + " attrTwo = " + AttrTwo + "\r\n");
foreach (TheListItem li in theListItems)
{
outText.Append(li.ToString());
}
return outText.ToString();
}
}
}
Ainsi que:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace MyNamespace
{
public class TheListItem
{
[XmlAttributeAttribute("attrA")]
public string AttrA { get; set; }
public override string ToString()
{
StringBuilder outText = new StringBuilder();
outText.Append(" attrA = " + AttrA + "\r\n");
return outText.ToString();
}
}
}
Mais ce sujet pour theElement
? Dois-je prendre le theOptionalList
élément comme un type tableau à lire ce qu'il trouve dans le fichier (soit rien, ou une seule), puis vérifier dans le code si elle est là ou pas? Ou est-il un autre décorateur que je peux fournir? Ou est-il juste de travail?
EDIT: j'ai fini par en utilisant les informations de cette réponse.
OriginalL'auteur John | 2011-10-28
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter
IsNullable = true
à laXmlArrayItem
attribut.theOptionalList
élément sans éléments, mais ne serait-il gérertheOptionalList
n'existant pas à tous? (Je ne pourrais pas comprendre ce que vous êtes en train de suggérer.) Aussi, il n'y a pas de schéma pour mon format, c'est par un accord verbal entre moi et un autre développeur. 🙂Je ne suis pas positif, mais je pense que l'utilisation d'
IsNullable
d'exclusion si le tableau est null.Considérons un schéma. Il est puissamment utile, si petit et est un grand morceau de votre "boîte à outils".
OriginalL'auteur James Johnson
Il ressemble, vous pouvez utiliser un autre bool pour spécifier d'inclure un élément ou non.
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx
Deserialize()
sur un fichier avec ce format? Parce que je ne pense pas que je peux dire à laXmlSerializer
pour l'ensemble du fichier à quoi s'attendre par élément. En d'autres termes, est-il un comportement par défaut si je désérialiser et il ne veut pas voir un membre qui est spécifié dans la classe?Oui, il y a un comportement par défaut, Le constructeur par défaut de la classe. Lorsque vous désérialisez votre XML, le
XMLSerializer
appelle le constructeur par défaut pour créer vos objets, de sorte que vous pouvez définir vos paramètres par défaut ici. Il est généralement utile de définir des valeurs par défaut pour les propriétés par défaut dans le constructeur et ajouter: this()
sur vos autres constructeurs pour assurer vos valeurs par défaut sont définies en premier.OriginalL'auteur K2so
Supplémentaires à la
XxySpecifed
de la propriété, il y a aussi une méthode avec unShouldSerialize
préfixeOriginalL'auteur kux