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; }