Come generare xsi: nil elemento con gli attributi?
-
26-09-2019 - |
Domanda
Ho un cliente WCF che ha bisogno di generare una richiesta che contiene questo frammento XML:
<reason xsi:nil="true" nullFlavor="NA" typeCode="RSON" />
Lo schema è determinato dal server e non è sotto il mio controllo. Il codice proxy generato ha una classe per l'elemento contenente motivo (tra le altre cose) proprietà nullFlavor
e typeCode
. Il proxy utilizza XmlSerializer.
Come posso generare un tale frammento? XmlSerializer emette l'attributo xsi:nil
solo se il corrispondente organo è nullo. E se è nullo, non può benissimo avere le proprietà che verranno emessi come attributi!
A proposito, il frammento è secondo legale del XML Schema Instance specifica, che dice un elemento nullo non può contenere elementi figlio o testo interno, ma possono contenere attributi.
Soluzione
Questa è una limitazione nota del XmlSerializer. Si può essere in grado di aggirare con qualche sapiente uso dell'interfaccia IXmlSerializable ed emettendo l'XML manualmente -. Purtroppo non c'è una soluzione pulita che io sappia
Altri suggerimenti
Ecco la soluzione che ho usato per quelli ancora alle prese con questo problema. E 'un po' di hack, ma funziona. Spegnere e aggiungere nillable e attributo come di seguito
[XmlAttributeAttribute( AttributeName = "nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance" )]
public bool NillAtt
{
get
{
return this.nillAtt;
}
set
{
nillAtt = value;
}
}