Serializzazione Xml – Nascondi valori nulli

Quando si utilizza un serializzatore Xml standard, esiste un modo per hide tutti i valori nulli? Il seguente è un esempio dell’output della mia class. Non voglio generare gli interi nulli se sono impostati su null.

Uscita Xml corrente:

   -1  

Quello che voglio:

   -1  

È ansible creare una funzione con il modello ShouldSerialize{PropertyName} che indica a XmlSerializer se deve serializzare il membro o meno.

Ad esempio, se la proprietà della class è denominata MyNullableInt è ansible

 public bool ShouldSerializeMyNullableInt() { return MyNullableInt.HasValue; } 

Ecco un esempio completo

 public class Person { public string Name {get;set;} public int? Age {get;set;} public bool ShouldSerializeAge() { return Age.HasValue; } } 

Serializzato con il seguente codice

 Person thePerson = new Person(){Name="Chris"}; XmlSerializer xs = new XmlSerializer(typeof(Person)); StringWriter sw = new StringWriter(); xs.Serialize(sw, thePerson); 

Risultati nel follower XML: si noti che non vi è alcuna età

  Chris  

Oltre a ciò che ha scritto Chris Taylor: se hai qualcosa serializzato come attributo, puoi avere una proprietà sulla tua class chiamata {PropertyName}Specified per controllare se dovrebbe essere serializzata. Nel codice:

 public class MyClass { [XmlAttribute] public int MyValue; [XmlIgnore] public bool MyValueSpecified; } 

Esiste una proprietà chiamata XmlElementAttribute.IsNullable

Se la proprietà IsNullable è impostata su true, l’attributo xsi: nil viene generato per i membri della class che sono stati impostati su un riferimento null.

L’esempio seguente mostra un campo con XmlElementAttribute applicato e la proprietà IsNullable impostata su false.

 public class MyClass { [XmlElement(IsNullable = false)] public string Group; } 

Puoi dare un’occhiata ad altri XmlElementAttribute per cambiare i nomi nella serializzazione ecc.

È ansible definire alcuni valori predefiniti e impedisce la serializzazione dei campi.

  [XmlElement, DefaultValue("")] string data; [XmlArray, DefaultValue(null)] List data; 
 private static string ToXml(Person obj) { XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add(string.Empty, string.Empty); string retval = null; if (obj != null) { StringBuilder sb = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(sb, new XmlWriterSettings() { OmitXmlDeclaration = true })) { new XmlSerializer(obj.GetType()).Serialize(writer, obj,namespaces); } retval = sb.ToString(); } return retval; } 

Nel mio caso le variabili / elementi nullable erano tutti di tipo String. Quindi, ho semplicemente eseguito un controllo e assegnato loro una stringa. Vuoto in caso di NULL. In questo modo mi sono sbarazzato degli attributi non necessari di nil e xmlns (p3: nil = “true” xmlns: p3 = “http://www.w3.org/2001/XMLSchema-instance)

 // Example: myNullableStringElement = varCarryingValue ?? string.Empty // OR myNullableStringElement = myNullableStringElement ?? string.Empty 

Preferisco creare il mio xml senza tag generati automaticamente. In questo posso ignorare la creazione dei nodes con valori null:

 public static string ConvertToXML(T objectToConvert) { XmlDocument doc = new XmlDocument(); XmlNode root = doc.CreateNode(XmlNodeType.Element, objectToConvert.GetType().Name, string.Empty); doc.AppendChild(root); XmlNode childNode; PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); foreach (PropertyDescriptor prop in properties) { if (prop.GetValue(objectToConvert) != null) { childNode = doc.CreateNode(XmlNodeType.Element, prop.Name, string.Empty); childNode.InnerText = prop.GetValue(objectToConvert).ToString(); root.AppendChild(childNode); } } return doc.OuterXml; }