和xmlDocument最大的不同——XmlReader逐行读取。单独很少使用,一般配合序列化(反序列化)使用,以下给出具体例子:
namespaceConsoleapplication1
{publicclassCData : IXmlSerializable
{PRivatestringcDataValue =null;publicstringCDataValue
{get{returncDataValue; }privateset{
cDataValue=value;
}
}publicCData()
{
}publicCData(stringdataValue)
{
cDataValue=dataValue;
}#regionIXmlSerializable MemberspublicSystem.Xml.Schema.XmlSchema GetSchema()
{returnnull;
}publicvoidReadXml(XmlReader reader)
{//当前读到此处的时候,//就是CData整个字符串<Name><![CData....]></Name>一堆东西//因此Read先读取Name,然后直接用Value获取内部的XmlCData的真实数据if(reader.Read())
{
cDataValue=reader.Value;
}
}publicvoidWriteXml(XmlWriter writer)
{//把当前的数据转换成CDataSection写入writer.WriteCData(cDataValue);
}#endregion}//把A改成Root[XmlRoot(ElementName ="Root")]publicclassA
{publicintId {get;set; }//强制指定自定义的格式化方式[XmlElement("Name",typeof(CData))]publicCData Name {get;set; }
}publicclassProgram
{staticvoidMain(string[] args)
{
StringBuilder sbu=newStringBuilder();//设置表头(设置编码格式和子Element的缩进符号)XmlWriterSettings setting =newXmlWriterSettings();
setting.Indent=true;
setting.IndentChars="\t";
setting.NewLineChars="\r\n";//必须用这种方式指定UTF-8输出格式,否则前面会加BOM,//另外注意,其实现在编码仍然是UTF-16,那是因为没有用Stream类//而是用StringBuilder,StringBuilder默认覆盖了Stream的UTF-8编码//强制使用UTF-16导致(具体参考:http://blog.csdn.net/ding544935/article/details/7610958)setting.Encoding =newUTF8Encoding(false);using(varwriter =XmlWriter.Create(sbu, setting))
{
XmlSerializer xz=newXmlSerializer(typeof(A));//去除命名空间XmlSerializerNamespaces emptyNameSpace =newXmlSerializerNamespaces();
emptyNameSpace.Add(string.Empty,string.Empty);//序列化xz.Serialize(writer,newA { Id =1, Name =newCData("董玮") }, emptyNameSpace);
}
Console.WriteLine(sbu.ToString());//以下是反序列化StringReader sr =newStringReader(sbu.ToString());
XmlReaderSettings rset=newXmlReaderSettings();
rset.IgnoreWhitespace=true;using(varreader =XmlReader.Create(sr, rset))
{
A a=null;
XmlSerializer xz2=newXmlSerializer(typeof(A));
a=(A)xz2.Deserialize(reader);
Console.WriteLine(a.Name.CDataValue);
}
}
}
}