2010-10-27 4 views
1

J'ai un client WCF qui doit générer une requête contenant ce fragment XML:Comment générer un élément xsi: nil avec des attributs?

<reason xsi:nil="true" nullFlavor="NA" typeCode="RSON" /> 

Le schéma est déterminé par le serveur et ne sont pas sous mon contrôle. Le code de proxy généré a une classe pour l'élément raison contenant (entre autres) les propriétés nullFlavor et typeCode. Le proxy utilise XmlSerializer.

Comment puis-je générer un tel fragment? Le XmlSerializer n'émet l'attribut xsi:nil que si le membre correspondant est null. Et si c'est nul, il ne peut pas très bien avoir des propriétés qui seront émises en attributs!

BTW, le fragment est conforme à la spécification d'instance de schéma XML, qui stipule qu'un élément nul ne peut contenir aucun élément enfant ou texte interne, mais peut contenir attributs.

Répondre

1

Il s'agit d'une limitation connue de XmlSerializer. Vous pourrez peut-être le contourner en faisant un usage intelligent de l'interface IXmlSerializable et en émettant le XML manuellement - malheureusement, je ne connais pas de solution propre.

0

Voici la solution que j'ai utilisée pour ceux qui sont encore aux prises avec ce problème. C'est un peu un hack mais ça marche. Désactiver nillable et ajoutez et attribut comme ci-dessous

[XmlAttributeAttribute(AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
public bool NillAtt 
{ 
    get 
    { 
     return this.nillAtt; 
    } 
    set 
    { 
     nillAtt = value; 
    } 
} 
+0

Cela fonctionne comme un charme quand tout simplement sérialisation/désérialisation messages xml, mais intégré dans une demande de WCF, ce qui provoque le WSDL à considérer invalide: System.InvalidOperationException: élément de schéma 'attribut' nommé 'nil' de l'espace de noms 'http://www.w3.org/2001/XMLSchema-instance'. L'espace de noms cible d'une déclaration d'attribut, qu'elle soit locale ou globale, ne doit pas correspondre à http://www.w3.org/2001/XMLSchema-instance. – oerkelens

Questions connexes