System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写器,该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件。
XmlReader与SAX读取器类似,不过前者是提取模式(只进只读的游标),后者是推送模式(将事件推送到应用程序)。
XmlReader的优点是:
1. 简化状态管理
2.可以有多个输入流
3.提取模式可以作为推送模式的基础,反之不行。
4.提供一个可以将字符串直接写入缓冲区,避免多余字节的的复制。
5.有选择的处理XML流,可以预先设置处理XML流的方式。
下面的代码代码逻辑简单不会出现异常所以没有加入异常处理,只是作为测试使用。
// ReadXml.cs // XmlReader示例 using System; using System.Xml; class Test { public static void Main( string [] args) { string path = @"G:资料C#面向对象编程C#面向对象编程CSharpChapter17ooks.xml" ; XmlReader reader = null ; try { // 创建XmlReaderSettings对象 XmlReaderSettings settings = new XmlReaderSettings(); // 设置XmlReaderSettings对象的属性 settings.ProhibitDtd = false ; // 使用XmlReaderSettings对象来创建XmlReader对象 reader = XmlReader.Create(path, settings); ReadXml(reader); reader.Close(); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (reader != null ) reader.Close(); } } private static void ReadXml(XmlReader reader) { try { // 解析文件,并显示每一个节点 while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.IsEmptyElement) // 空元素? { Console.WriteLine( "<{0}/>" , reader.Name); } else { Console.Write( "<{0}" , reader.Name); if (reader.HasAttributes) // 属性? { while (reader.MoveToNextAttribute()) { Console.Write( " {0}="{1}"" , reader.Name, reader.Value); } } Console.WriteLine( ">" , reader.Name); } break ; case XmlNodeType.Text: Console.WriteLine(reader.Value); break ; case XmlNodeType.CDATA: Console.WriteLine( "<![CDATA[{0}]]>" , reader.Value); break ; case XmlNodeType.ProcessingInstruction: Console.WriteLine( "<?{0} {1}?>" , reader.Name, reader.Value); break ; case XmlNodeType.Comment: Console.WriteLine( "<!--{0}-->" , reader.Value); break ; case XmlNodeType.XmlDeclaration: Console.WriteLine( "<?xml version='1.0'?>" ); break ; case XmlNodeType.Document: break ; case XmlNodeType.DocumentType: Console.WriteLine( "<!DOCTYPE {0} [{1}]>" , reader.Name, reader.Value); break ; case XmlNodeType.EntityReference: Console.WriteLine(reader.Name); break ; case XmlNodeType.EndElement: Console.WriteLine( "</{0}>" , reader.Name); break ; } } } catch (XmlException ex) { Console.WriteLine(ex.Message); } } } |
XmlWriters该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件,优点基本和前者一样。
注意:使用 XmlReader,在调用 Close 方法前,不会读取元素和特性。
XMLWriter using System.Xml; namespace ConsoleApplication1 { class Program { static void Main( string [] args) { string path= @"C:UsersdellDesktop est.xml" ; XmlWriter writer= null ; XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true ; settings.IndentChars=( "" ); writer = XmlWriter.Create(path, settings); WriteXml(writer); writer.Close(); } private static void WriteXml(XmlWriter writer) { writer.WriteStartElement( "books" ); WriteChildNode(writer, "红楼梦" , "曹雪芹" , "25" ); WriteChildNode(writer, "三国演义" , "罗贯中" , "20" ); WriteChildNode(writer, "水浒传" , "施耐庵" , "18" ); WriteChildNode(writer, "聊斋志异" , "蒲松龄" , "16" ); writer.WriteEndElement(); } private static void WriteChildNode(XmlWriter writer, string title, string author, string price) { writer.WriteStartElement( "book" ); writer.WriteStartElement( "title" ); writer.WriteValue(title); writer.WriteEndElement(); writer.WriteStartElement( "author" ); writer.WriteValue(author); writer.WriteEndElement(); writer.WriteStartElement( "price" ); writer.WriteValue(price); writer.WriteEndElement(); writer.WriteEndElement(); } } } |
基本用法很简单,就是输出前后开关标签 ,主要使用这三个方法WriteStartElement() writer.WriteValue() WriteEndElement()
注意: XmlWriter 方法输出 XML 时,在调用 Close 方法前,不会写入元素和特性。