117 votes

Sérialisation Xml - Masquer les valeurs nulles

Lorsque j'utilise un sérialiseur Xml standard .NET, existe-t-il un moyen de masquer toutes les valeurs nulles ? Le tableau ci-dessous est un exemple de la sortie de ma classe. Je ne veux pas afficher les entiers nullables s'ils sont définis comme nuls.

Sortie Xml actuelle :

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myNullableInt p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" />
   <myOtherInt>-1</myOtherInt>
</myClass>

Ce que je veux :

<?xml version="1.0" encoding="utf-8"?>
<myClass>
   <myOtherInt>-1</myOtherInt>
</myClass>

239voto

Chris Taylor Points 25865

Vous pouvez créer une fonction avec le modèle ShouldSerialize{PropertyName} qui indique au XmlSerializer s'il doit sérialiser le membre ou non.

Par exemple, si la propriété de votre classe s'appelle MyNullableInt vous auriez pu

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

Voici un échantillon complet

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

Sérialisé avec le code suivant

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

Le résultat est le suivant : XML - Notez qu'il n'y a pas d'âge.

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Chris</Name>
</Person>

31voto

Daniel Rose Points 8024

En complément de ce qu'a écrit Chris Taylor : si vous avez quelque chose de sérialisé comme un attribut, vous pouvez avoir une propriété sur votre classe nommée {PropertyName}Specified pour contrôler si elle doit être sérialisée. Dans le code :

public class MyClass
{
    [XmlAttribute]
    public int MyValue;

    [XmlIgnore]
    public bool MyValueSpecified;
}

26voto

JPBlanc Points 26156

Il existe une propriété appelée XmlElementAttribute.IsNullable

Si la propriété IsNullable est définie sur true, l'attribut xsi:nil est généré pour les membres de la classe qui ont été définis sur une référence nulle.

L'exemple suivant montre un champ avec l'option XmlElementAttribute qui lui est appliqué, et la propriété IsNullable définie sur false.

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

Vous pouvez consulter d'autres XmlElementAttribute pour changer les noms dans la sérialisation, etc.

10voto

MichaelSo Points 41

Vous pouvez définir certaines valeurs par défaut et cela empêche les champs d'être sérialisés.

    [XmlElement, DefaultValue("")]
    string data;

    [XmlArray, DefaultValue(null)]
    List<string> data;

1voto

Rauld Points 382
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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X