2009-08-18 8 views
6

Je souhaite ignorer la création d'un élément vide dans un fichier XML lors de la sérialisation xml en C#.C# XML Sérialisation d'un tableau - Ignorer les valeurs de chaîne "vides"

Ex:

ArrayElements elm = new ArrayElements 
{ Items =new string[] "Item1", " ", "Item2", " ", " ", "Items" } }; 

Pendant la sérialisation, il devrait sauter les chaînes vides.

C'est ma classe:

[Serializable] 
public class ArrayElements 
{ 
    [XmlElement(IsNullable=false)] 
    public string[] Items { get; set; } 
} 
+0

S'il vous plaît ajouter des étiquettes et de modifier la question pour inclure la langue, le cadre, etc. Donner suffisamment d'informations, aide les autres à vous aider. – shahkalpesh

Répondre

2

Êtes-vous sûr que ce soit ce que vous voulez? Un inconvénient, c'est que lorsque vous désérialisez, vous ne pouvez pas récupérer les chaînes vides, car le désérialiseur n'a aucun moyen de les connaître. Habituellement, lorsque vous désérialisez, vous voulez récupérer une instance qui ressemble exactement à celle que vous avez sérialisée à l'origine.

Si ce est ce que vous voulez, alors vous devez modifier votre objet en fonction du processus de sérialisation. Comme le suggère Cheeso, une propriété de substitution est une bonne solution pour cela.

Aussi, juste pour plus de clarté, ai-je raison de dire que vous avez un objet ArrayElements qui a une propriété Items, qui est un tableau de string s?

+0

Oui, j'ai un objet ArrayElements qui a une propriété Items, qui est un tableau de chaînes. – user146584

8

Vous pouvez le faire avec une propriété de substitution.

namespace Cheeso.Xml.Samples.Arrays 
{ 
    static class Extensions 
    { 
     private static XmlSerializerNamespaces _ns; 

     static Extensions() 
     { 
      // to suppress unused default namespace entries in the root elt 
      _ns = new XmlSerializerNamespaces(); 
      _ns.Add("", ""); 
     } 

     public static string SerializeToString(this XmlSerializer s, object o) 
     { 
      var builder = new System.Text.StringBuilder(); 
      var settings = new System.Xml.XmlWriterSettings { OmitXmlDeclaration = true, Indent= true }; 

      using (var writer = System.Xml.XmlWriter.Create(builder, settings)) 
      { 
       s.Serialize(writer, o, _ns); 
      } 
      return builder.ToString(); 
     } 
    } 

    [XmlType("ArrayOfString")] 
    public class MyContainer 
    { 
     [XmlIgnore] 
     public String[] a; 

     // surrogate property 
     [XmlElement("string")] 
     public String[] A 
     { 
      get 
      { 
       List<String> _proxy = new List<String>(); 
       foreach (var s in a) 
       { 
        if (!String.IsNullOrEmpty(s)) 
         _proxy.Add(s); 
       } 
       return _proxy.ToArray(); 
      } 
      set 
      { 
       a = value; 
      } 
     } 
    } 

    class StringArrayOnlyNonEmptyItems 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       Console.WriteLine("\nRegular Serialization of an array of strings with some empty elements:"); 
       String[] x = { "AAA", "BBB", "", "DDD", "", "FFF" }; 
       XmlSerializer s1 = new XmlSerializer(typeof(String[])); 
       string s = s1.SerializeToString(x); 
       Console.WriteLine(s); 

       Console.WriteLine("\nSerialization of an array of strings with some empty elements, via a Container:"); 
       MyContainer c = new MyContainer(); 
       c.a = x; 
       XmlSerializer s2 = new XmlSerializer(typeof(MyContainer)); 
       s = s2.SerializeToString(c); 
       Console.WriteLine(s); 
      } 
      catch (System.Exception exc1) 
      { 
       Console.WriteLine("uncaught exception:\n{0}", exc1); 
      } 
     } 
    } 
} 
Questions connexes