Como gerar o elemento XSI: NIL com atributos?
-
26-09-2019 - |
Pergunta
Eu tenho um cliente WCF que precisa gerar uma solicitação contendo este fragmento XML:
<reason xsi:nil="true" nullFlavor="NA" typeCode="RSON" />
O esquema é determinado pelo servidor e não está sob meu controle. O código de proxy gerado possui uma classe para o elemento motivo que contém (entre outras coisas) propriedades nullFlavor
e typeCode
. O proxy usa o XMLSerializer.
Como posso gerar esse fragmento? O XMLSerializer emite o xsi:nil
atributo apenas se o membro correspondente for nulo. E se for nulo, não pode muito bem ter propriedades que serão emitidas como atributos!
BTW, o fragmento é legal de acordo com a especificação da instância do esquema XML, que diz que um elemento nulo não pode conter nenhum elemento filho ou texto interno, mas poderia contém atributos.
Solução
Esta é uma limitação conhecida do XMLSerializer. Você pode contorná -lo com algum uso inteligente da interface ixmlSerializable e emitir o XML manualmente - infelizmente não há uma solução limpa que eu conheço.
Outras dicas
Aqui está a solução que usei para aqueles que ainda lutam com esse problema. É um pouco de hack, mas funciona. Desligue o Nillable e adicione e atribua como abaixo
[XmlAttributeAttribute( AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance" )]
public bool NillAtt
{
get
{
return this.nillAtt;
}
set
{
nillAtt = value;
}
}