和xmlDocument最大的不同——XmlReader逐行讀取。單獨(dú)很少使用,一般配合序列化(反序列化)使用,以下給出具體例子:
namespace Consoleapplication1{ public class CData : IXmlSerializable { PRivate string cDataValue = null; public string CDataValue { get { return cDataValue; } private set { cDataValue = value; } } public CData() { } public CData(string dataValue) { cDataValue = dataValue; } #region IXmlSerializable Members public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { //當(dāng)前讀到此處的時(shí)候, //就是CData整個(gè)字符串<Name><![CData....]></Name>一堆東西 //因此Read先讀取Name,然后直接用Value獲取內(nèi)部的XmlCData的真實(shí)數(shù)據(jù) if (reader.Read()) { cDataValue = reader.Value; } } public void WriteXml(XmlWriter writer) { //把當(dāng)前的數(shù)據(jù)轉(zhuǎn)換成CDataSection寫(xiě)入 writer.WriteCData(cDataValue); } #endregion } // 把A改成Root [XmlRoot(ElementName = "Root")] public class A { public int Id { get; set; } //強(qiáng)制指定自定義的格式化方式 [XmlElement("Name", typeof(CData))] public CData Name { get; set; } } public class Program { static void Main(string[] args) { StringBuilder sbu = new StringBuilder(); //設(shè)置表頭(設(shè)置編碼格式和子Element的縮進(jìn)符號(hào)) XmlWriterSettings setting = new XmlWriterSettings(); setting.Indent = true; setting.IndentChars = "/t"; setting.NewLineChars = "/r/n"; //必須用這種方式指定UTF-8輸出格式,否則前面會(huì)加BOM, //另外注意,其實(shí)現(xiàn)在編碼仍然是UTF-16,那是因?yàn)闆](méi)有用Stream類(lèi) //而是用StringBuilder,StringBuilder默認(rèn)覆蓋了Stream的UTF-8編碼 //強(qiáng)制使用UTF-16導(dǎo)致(具體參考:http://blog.csdn.net/ding544935/article/details/7610958) setting.Encoding = new UTF8Encoding(false); using (var writer = XmlWriter.Create(sbu, setting)) { XmlSerializer xz = new XmlSerializer(typeof(A)); //去除命名空間 XmlSerializerNamespaces emptyNameSpace = new XmlSerializerNamespaces(); emptyNameSpace.Add(string.Empty, string.Empty); //序列化 xz.Serialize(writer, new A { Id = 1, Name = new CData("董瑋") }, emptyNameSpace); } Console.WriteLine(sbu.ToString()); //以下是反序列化 StringReader sr = new StringReader(sbu.ToString()); XmlReaderSettings rset = new XmlReaderSettings(); rset.IgnoreWhitespace = true; using (var reader = XmlReader.Create(sr, rset)) { A a = null; XmlSerializer xz2 = new XmlSerializer(typeof(A)); a = (A)xz2.Deserialize(reader); Console.WriteLine(a.Name.CDataValue); } } }}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注