Logo UGIdotNET

Serializzare elementi CData implementando IXmlSerializable

Nei documenti Xml a volte fa comodo avere campi CDATA, ma la potente macchina di serializzazione Xml offerta dal Framework non dispone di attributi per gestire tali tipi di campi. In questo tip mostro come implementare IXmlSerializable solo per quei nodi che mi interessa avere come CDATA.

public class CDATA: IXmlSerializable
{
  public string Text;

  //Il costruttore di default è necessario alla serializzazione ...
  public CDATA(){}

  //... questo invece è un costruttore cha può far comodo.
  public CDATA(string text)
  {
    this.Text = text;
  }

  void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
  {
    writer.WriteCData(this.Text);
  }

  System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
  {
    //TODO: Questo metodo deve tornare lo schema dell'Xml prodotto dalla serializzazione.
    //Tale metodo verrà chiamato nel caso in cui vi sia necessità di creare un xsd relativo ad
    //un oggetto CDATA, esempio nei wsdl dei web services.

    return null;
  }

  void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
  {
    this.Text = reader.ReadElementString();
  }
}

Se proviamo ad applicare la classe CDATA come nell'esempio che segue

public class SampleClass
{
  [XmlElement("content")]
  public CDATA CDATAContent;
}

SampleClass c = new SampleClass();
c.CDATAContent = new CDATA("<P>Testo HTML esempio.</P>");

e proviamo a serializzare verrà generato il seguente Xml:

<?xml version="1.0" encoding="utf-8"?>
<SampleClass>
  <content><![CDATA[<P>Testo HTML esempio.</P>]]></content>
</SampleClass>

Attenzione l'interfaccia IXmlSerializable non è documentata e MSDN sconsiglia l'uso di essa direttamente nel codice.
Con il framework 2.0 l'interfaccia sarà consolidata e documentata.

Autore: Marco Barzaghi
Data: 26 gennaio 2005
Ultimo aggiornamento: 24 novembre 2005
Categorie: 

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185