C#中基于流的XML文件操作笔记
System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写器,该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件。
XmlReader与SAX读取器类似,不过前者是提取模式(只进只读的游标),后者是推送模式(将事件推送到应用程序)。
XmlReader的优点是:
1.简化状态管理
2.可以有多个输入流
3.提取模式可以作为推送模式的基础,反之不行。
4.提供一个可以将字符串直接写入缓冲区,避免多余字节的的复制。
5.有选择的处理XML流,可以预先设置处理XML流的方式。
下面的代码代码逻辑简单不会出现异常所以没有加入异常处理,只是作为测试使用。
//ReadXml.cs //XmlReader示例 usingSystem; usingSystem.Xml; classTest { publicstaticvoidMain(string[]args) { stringpath=@"G:\资料\C#面向对象编程\C#面向对象编程\CSharp\Chapter17\books.xml"; XmlReaderreader=null; try { //创建XmlReaderSettings对象 XmlReaderSettingssettings=newXmlReaderSettings(); //设置XmlReaderSettings对象的属性 settings.ProhibitDtd=false; //使用XmlReaderSettings对象来创建XmlReader对象 reader=XmlReader.Create(path,settings); ReadXml(reader); reader.Close(); Console.ReadKey(); } catch(Exceptionex) { Console.WriteLine(ex.Message); } finally { if(reader!=null) reader.Close(); } } privatestaticvoidReadXml(XmlReaderreader) { try { //解析文件,并显示每一个节点 while(reader.Read()) { switch(reader.NodeType) { caseXmlNodeType.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; caseXmlNodeType.Text: Console.WriteLine(reader.Value); break; caseXmlNodeType.CDATA: Console.WriteLine("<![CDATA[{0}]]>",reader.Value); break; caseXmlNodeType.ProcessingInstruction: Console.WriteLine("<?{0}{1}?>",reader.Name,reader.Value); break; caseXmlNodeType.Comment: Console.WriteLine("<!--{0}-->",reader.Value); break; caseXmlNodeType.XmlDeclaration: Console.WriteLine("<?xmlversion='1.0'?>"); break; caseXmlNodeType.Document: break; caseXmlNodeType.DocumentType: Console.WriteLine("<!DOCTYPE{0}[{1}]>",reader.Name,reader.Value); break; caseXmlNodeType.EntityReference: Console.WriteLine(reader.Name); break; caseXmlNodeType.EndElement: Console.WriteLine("</{0}>",reader.Name); break; } } } catch(XmlExceptionex) { Console.WriteLine(ex.Message); } } }
XmlWriters该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件,优点基本和前者一样。
注意:使用XmlReader,在调用Close方法前,不会读取元素和特性。
XMLWriter usingSystem.Xml; namespaceConsoleApplication1 { classProgram { staticvoidMain(string[]args) { stringpath=@"C:\Users\dell\Desktop\test.xml"; XmlWriterwriter=null; XmlWriterSettingssettings=newXmlWriterSettings(); settings.Indent=true; settings.IndentChars=(""); writer=XmlWriter.Create(path,settings); WriteXml(writer); writer.Close(); } privatestaticvoidWriteXml(XmlWriterwriter) { writer.WriteStartElement("books"); WriteChildNode(writer,"红楼梦","曹雪芹","25"); WriteChildNode(writer,"三国演义","罗贯中","20"); WriteChildNode(writer,"水浒传","施耐庵","18"); WriteChildNode(writer,"聊斋志异","蒲松龄","16"); writer.WriteEndElement(); } privatestaticvoidWriteChildNode(XmlWriterwriter,stringtitle,stringauthor,stringprice) { 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方法前,不会写入元素和特性。