Come ti serializzo in CDATA

A volte fa comodo avere deio campi con dei CDATA sopratutto quando il contenuto del testo di un nodo deve essere in documento HTML o documento XML. In .NET _non_ è possibile in modo semplice decorare una proprietà/campo in modo che il serializzatore renderizzi un nodo CDATA... questo è un bel problema, la serializzazione mi consente praticità nella crezione dei file XML, ma io voglio un campo CDATA nel mio XML! Roba da non dormirci la notte! Quello che ho fatto è stato implementare IXmlSerializable solo per quella parte che mi interessava trattare diversamente.

 public class SampleClass
 {
  [XmlElement("content", IsNullable=true)]
  public CDATA Text;
 }

 public class CDATA: IXmlSerializable
 {
  private string text;

  #region Constructors
  public CDATA()
  {
  }

  public CDATA(string text)
  {
   this.text = text;
  }
  #endregion

  #region Properties
  public string Value
  {
   get{return text;}
  }
  #endregion

  #region IXmlSerializable Members
  void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
  {
   writer.WriteCData(this.text);
  }

  System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
  {
   //MSDN dice "This member supports the .NET Framework infrastructure 
   //and is not intended to be used directly from your code."
   //...se ho capito lo scopo del metodo per i nostri casi d'uso va benissimo 
   //fare tornare null.
   return null;
  }

  void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
  {
   //(@update 04-nov-2005, vedi errata korrige)

   //this.text = reader.ReadString();
   //reader.Read()     
    this.Text = reader.GetElementString();
  }
  #endregion
 }

Facciamo un test prima di consegnare :-D

 public class SampleSerializer
 {
  public static void SaveXml(SampleClass c, string path)
  {
   XmlSerializer ser = new XmlSerializer(typeof(SampleClass));   
   using(StreamWriter w = new StreamWriter(path))
   {
    ser.Serialize(w, c);
   }
  }

  public static SampleClass ReadXml(string path)
  {
   XmlSerializer ser = new XmlSerializer(typeof(SampleClass));   
   using(StreamReader r = new StreamReader(path))
   {
    return (SampleClass)ser.Deserialize(r);
   }
  }
 }

 SampleClass c = new SampleClass();
 c.Text = new CDATA("<P>Paragrafo esempio.</P>");
 SampleSerializer.SaveXml(c, @"c:\b.xml");
 SampleClass c2 = SampleSerializer.ReadXml(@"c:\b.xml");
 MessageBox.Show(c2.Text.Value);

Dimenticavo, questo è l'XML generato :-p

<?xml version="1.0" encoding="utf-8"?>
<SAMPLECLASS xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CONTENT><![CDATA[<P>Paragrafo esempio.<P></P>]]></CONTENT>
</SAMPLECLASS>

Direi che questo post ha la candidatura a tip :-D

Technorati Tags:

posted @ martedì 28 dicembre 2004 12:19

Print

Comments on this entry:

# re: Come ti serializzo in CDATA

Left by Adrian Florea at 29/12/2004 01:28
Gravatar
Ciao M.rkino,

per evitare CDATA potresti convertire a/da Base64 nei getter/setter della proprietà

# re: Come ti serializzo in CDATA

Left by M.rkino at 29/12/2004 01:57
Gravatar
...lo scopo non è evitare un CDATA ma avere un CDATA, mi è comodo perchè se devo incapsulare un documento html o xml il contenuto mi risulta più leggibile alla vista e quindi più facilmente modificabile anche a mano... :-p

# re: Come ti serializzo in CDATA

Left by M.rkino at 30/01/2005 17:56
Gravatar
Grazie Fabrzio, ho già comunicato l'errata korrige. Si effettivamente è stato un disalliamento tra il codice che rivedevo nel mentre che scrivevo il tip.

# CDATA XmlSerializer

Left by Emitter at 16/02/2005 15:36
Gravatar

# Markino rules!!!

Left by Lorenzo Barbieri @ UGIblogs! at 16/02/2005 15:54
Gravatar

# re: Come ti serializzo in CDATA

Left by Xpang at 06/12/2006 17:10
Gravatar
Thx!!!!
i really appreciate your code, which helps me a lot with this CDATA-serialization problem!!
Thx again!!!!

# Hydrocodone online without prescription.

Left by Effects of hydrocodone. at 25/09/2009 23:15
Gravatar
Hydrocodone addiction. Buy hydrocodone online. Hydrocodone 1923. How to ween off hydrocodone while pregnant. Snorting hydrocodone. Cold water extraction for hydrocodone. Hydrocodone withdrawal.
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011