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 10.19

Print

Comments on this entry:

# re: Come ti serializzo in CDATA

Left by Andrea Saltarello at 28/12/2004 10.44
Gravatar
Beh... Quando (con l'uscita del FX 2.0) IXmlSerializable sarà documentata e non + dichiarata "for internal use only" direi che il tip ci starà tutto. BTW, peccato che la definizione di IXmlSerializable nel FX 2.0 sia differente da qlla attuale, e che il codice che la implementa debba essere riscritto :-D

# re: Come ti serializzo in CDATA

Left by Adrian Florea at 28/12/2004 23.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 28/12/2004 23.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 Fabrizio Camera at 26/01/2005 9.03
Gravatar
Ciao. Volevo segnalarti che c'è un piccolo errore nella pagina http://www.ugidotnet.org/tips/tips_read.aspx?ID=151

La riga
c.CDATAContent.Text = new CDATA("<P>Testo HTML esempio.</P>");
penso debba essere invece
c.CDATAContent = new CDATA("<P>Testo HTML esempio.</P>");

Forse un copia/incolla da questa del blog?

A parte questo, l'esempio è molto utile.
Grazie.

# re: Come ti serializzo in CDATA

Left by M.rkino at 30/01/2005 15.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 13.36
Gravatar

# Markino rules!!!

Left by Lorenzo Barbieri @ UGIblogs! at 16/02/2005 13.54
Gravatar

# re: Come ti serializzo in CDATA

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

# CDATA XmlSerializer

Left by Pingback/TrackBack at 18/10/2007 12.02
Gravatar
Trying to add a CDATA section while serializing your instance? Try this or wait a bit longer for .NET 2.0 to arrive.

# Hydrocodone online without prescription.

Left by Effects of hydrocodone. at 25/09/2009 20.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.

# Valium tolerance.

Left by Valium. at 30/09/2009 18.18
Gravatar
Valium snort. Purchase valium. No prescription valium. Buy valium online save wholesale price yep. Interresults valium. Valium statistics. Valium.

# continues atmosphere assumptions continue

Left by continues atmosphere assumptions continue at 02/10/2009 19.56
Gravatar
impact lapse exempt area various

Your comment:



 (will not be displayed)


 
 
 
Please add 3 and 2 and type the answer here:
 

Live Comment Preview:

 
«febbraio»
domlunmarmergiovensab
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910