Ho un sacco di classi C#, che sono generate automaticamente da un XSD. Quindi creo file XML basati su quelle classi C#. Nulla di esistente finora.Posso avere attributo nullo e altro attributo nello stesso tag in XML creato dalla classe generata da XSD C#?
Il problema:
I file XML generati stanno attraversando la convalida e la convalida richiede un attributo in più per tutti i tag XML con xsi:nil="true"
. Fondamentalmente i tag dovrebbero assomigliare a: <testTag.01 xsi:nil="true" NV="123123" />
, ma non posso ottenerlo in C#. Il mio codice è:
if (myObject.TestTag.HasValue) { t.testTag01 = new testTag01(); t.testTag01.Value = myObject.TestTag.Value; } //else //{ // t.testTag01 = new testTag01(); // t.testTag01.NV = "123123";//Not Recorded //}
Questo codice genera <testTag.01>SomeValue</testTag.01>
o <testTag.01 xsi:nil="true"/>
.
Se io rimuovere il commento dalla ELSE, il risultato sarebbe: <testTag.01>SomeValue</testTag.01>
o <testTag.01 NV="123123" />
.
Quindi non ho idea di come arrivare al formato, che è richiesto dallo strumento di convalida. Qualche idea ?
P.S.
Ecco l'auto-generato C# classe:
/// [System.CodeDom.Compiler.GeneratedCodeAttribute ("XSD", "4.0.30319.33440")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute ("codice")] [System.Xml.Serialization.XmlTypeAttribute (AnonymousType = true, Namespace = "http://www.blabla.org ")]
public partial class testTag01 {
private string nvField; private SomeEnum valueField; /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute()] public string NV { get { return this.nvField; } set { this.nvField = value; } } /// <remarks/> [System.Xml.Serialization.XmlTextAttribute()] public SomeEnum Value { get { return this.valueField; } set { this.valueField = value; } } }
non vorrei alterare quella parte, ma capisco che è impossibile senza farlo. Inoltre ho provato a impostare SomeEnum come Nullable. public SomeEnum? Value
, ma è un'eccezione:
Cannot serialize member 'Value' of type System.Nullable`1[]. XmlAttribute/XmlText cannot be used to encode complex types.
È necessario visualizzare le classi generate automaticamente. Questi di solito dovevano essere modificati. Non è necessario aggiungere codice per produrre valori nulli. – jdweng
Ho messo la classe. Inoltre ho provato a impostare il valore su Nullable, ma sta generando un'eccezione. :-( – Tech0
Questo non funzionerà fuori dalla scatola. Vedi [** Xsi: nil Supporto Binding Attributo **: L'attributo nil e altri attributi] (https://msdn.microsoft.com/en-us/library/ ybce7f69.aspx). – dbc