Prise en charge de la liaison de l'attribut Xsi:nil
Cette rubrique est spécifique à une technologie existante. Les services Web XML et les clients du service Web XML doivent à présent être créés à l'aide de Windows Communication Foundation.
Le .NET Framework fournit la prise en charge de liaison partielle pour l'attribut xsi:nil.
La classe XmlSerializer assimile une valeur d'attribut xsi:nil="true"
à une référence Null assignée à un type référence ou à un type valeur non Nullable. XmlSerializer lève une exception lorsqu'il essaie de désérialiser une instance d'un type valeur non Nullable si l'attribut nil a la valeur true
. (Pour plus d'informations sur les types Nullable, consultez Nullable Types (C# Programming Guide)).
Explication
L'attribut nil est défini dans l'espace de noms de l'instance du schéma XML, http://www.w3.org/2001/XMLSchema-instance (généralement associé au préfixe xsi). Il s'applique uniquement aux instances de document XML, et non aux documents de schéma XML. La valeur true
affectée à l'attribut xsi:nil dans un élément XML spécifie explicitement que l'élément n'a aucun contenu, soit aucun élément enfant ou corps de texte.
Un attribut nil peut uniquement apparaître de manière correcte dans un élément XML dont la déclaration XSD contient un attribut nillable avec la valeur true
. Consultez l'attribut nillable pour savoir comment le .NET Framework détermine si un paramètre nillable="true"
s'applique à un élément XML correspondant à un objet ou un membre.
La classe XmlSerializer assimile une valeur true
pour l'attribut nil à une référence null (Nothing en Visual Basic) et exécute les conversions suivantes au moment de l'exécution :
Lors de la désérialisation d'un document XML en objets : si la classe XmlSerializer rencontre un élément XML qui spécifie
xsi:nil="true"
, elle assigne une référence null (si applicable) à l'objet correspondant.Lors de la sérialisation d'objets en document XML : si la classe XmlSerializer rencontre une référence null pour un objet qui correspond à un élément XML, elle génère un élément qui spécifie
xsi:nil="true"
ou ignore complètement cet élément, selon qu'un paramètrenillable="true"
s'applique ou non.
Attribut nil et types valeur non Nullable
Dans la mesure où un type valeur non Nullable ne peut jamais avoir comme valeur une référence null, lorsqu'un membre de classe d'un type valeur est mappé à une déclaration d'élément XML, la classe XmlSerializer n'a aucune raison de sortir l'attribut xsi:nil pour un élément d'instance correspondant pendant la sérialisation.
La classe XmlSerializer ne peut pas désérialiser un élément XML dont le type de données est mappé à un type valeur non Nullable et dont l'attribut nil a la valeur true
. Lors de la désérialisation d'un document XML en objets, si la classe XmlSerializer rencontre un tel élément, elle lève une System.FormatException : « Le format de la chaîne d'entrée est incorrect ». Cette situation peut survenir si le document XML a été créé par une implémentation de schéma XML qui permet à l'attribut nil d'apparaître dans des instances de types de données de schéma que le .NET Framework lie aux types valeur non Nullable.
Attribut nil et autres attributs
La spécification de schéma XML permet à d'autres attributs XML d'apparaître dans un élément dont l'attribut xsi:nil a la valeur true
. Dans la mesure où la classe XmlSerializer affecte à l'attribut nil la valeur true
uniquement lorsqu'une référence null est assignée à l'objet correspondant, les champs d'objet qui représentent des attributs XML (via un attribut de type System.Xml.Serialization.XmlAttributeAttribute) ne peuvent même pas exister en mémoire à cette étape.
Par conséquent, la classe XmlSerializer traite les attributs supplémentaires comme suit :
Lors de la sérialisation d'objets en document XML : si la classe XmlSerializer rencontre une référence null pour un objet correspondant à un élément XML pour lequel l'attribut nil doit être spécifié, elle omet tous les autres attributs.
Lors de la désérialisation d'un document XML en objets : si la classe XmlSerializer rencontre un élément XML qui spécifie
xsi:nil="true"
, elle assigne une référence null à l'objet correspondant et ignore tous les autres attributs. Cette situation peut survenir si le document XML a été créé par une implémentation de schéma XML qui permet à d'autres attributs d'apparaître avecxsi:nil="true"
; l'attribut nil avec la valeurtrue
n'est donc pas lié à une référence d'objet nulle.
Attribut nil non valide pour les types de chaîne
Consultez la déclaration <element> suivante avec la valeur false
par défaut spécifiée explicitement pour l'attribut nillable :
<xsd:element name="key" type="xsd:string" nillable="false" />
Cet élément crée une liaison avec le membre de classe suivant (la valeur false
par défaut est spécifiée explicitement pour la propriété IsNullable) :
[System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
public string key;
Imaginez qu'une instance de document XML contient l'élément suivant qui doit être conforme à la déclaration <element> précédente :
<key xsi:nil="true"/>
La classe XmlValidatingReader reconnaît cet élément comme non valide, car il utilise un attribut d'instance nil alors que la valeur de l'attribut de définition nillable est false
. Toutefois, la classe XmlSerializer ne lève pas d'exception lors de la désérialisation de cet élément ; à la place, elle affecte au champ key
correspondant une chaîne vide, exprimée comme suit : ""
.
Éléments conteneurs possibles : tout élément d'instance