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:
XML Serializzazione CDATA Framework.NET
posted @ martedì 28 dicembre 2004 12:19