C#中基于流的XML文件操作笔记
程序员文章站
2023-12-01 15:45:22
system.xml.xmlreader和system.xml.xmlwriters是两个抽象类,xmlreader提供了对于xml数据的快速,非缓存,只进模式的读取器,x...
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#面向对象编程\csharp\chapter17\books.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:\users\dell\desktop\test.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 方法前,不会写入元素和特性。
上一篇: C#自定义缓存封装类实例
下一篇: sql 随机抽取几条数据的方法 推荐