基于流的XML文件操作笔记
System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写器,该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件。
XmlReader与SAX读取器类似,不过前者是提取模式(只进只读的游标),后者是推送模式(将事件推送到应用程序)。
XmlReader的优点是:
1. 简化状态管理
2.可以有多个输入流
3.提取模式可以作为推送模式的基础,反之不行。
4.提供一个可以将字符串直接写入缓冲区,避免多余字节的的复制。
5.有选择的处理XML流,可以预先设置处理XML流的方式。
下面的代码代码逻辑简单不会出现异常所以没有加入异常处理,只是作为测试使用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // ReadXml.cs
2 // XmlReader示例
3
4 using System;
5 using System.Xml;
6
7 class Test
8 {
9 public static void Main(string[] args)
10 {
11 string path = @"G:\资料\C#面向对象编程\C#面向对象编程\CSharp\Chapter17\books.xml";
12 XmlReader reader = null;
13 try
14 {
15 // 创建XmlReaderSettings对象
16 XmlReaderSettings settings = new XmlReaderSettings();
17 // 设置XmlReaderSettings对象的属性
18 settings.ProhibitDtd = false;
19 // 使用XmlReaderSettings对象来创建XmlReader对象
20 reader = XmlReader.Create(path, settings);
21 ReadXml(reader);
22 reader.Close();
23 Console.ReadKey();
24 }
25 catch (Exception ex)
26 {
27 Console.WriteLine(ex.Message);
28 }
29 finally
30 {
31 if (reader != null)
32 reader.Close();
33 }
34 }
35
36 private static void ReadXml(XmlReader reader)
37 {
38 try
39 {
40 // 解析文件,并显示每一个节点
41 while (reader.Read())
42 {
43 switch (reader.NodeType)
44 {
45 case XmlNodeType.Element:
46 if (reader.IsEmptyElement) // 空元素?
47 {
48 Console.WriteLine("<{0}/>", reader.Name);
49 }
50 else
51 {
52 Console.Write("<{0}", reader.Name);
53 if (reader.HasAttributes) // 属性?
54 {
55 while (reader.MoveToNextAttribute())
56 {
57 Console.Write(" {0}=\"{1}\"", reader.Name, reader.Value);
58 }
59 }
60 Console.WriteLine(">", reader.Name);
61 }
62 break;
63 case XmlNodeType.Text:
64 Console.WriteLine(reader.Value);
65 break;
66 case XmlNodeType.CDATA:
67 Console.WriteLine("<![CDATA[{0}]]>", reader.Value);
68 break;
69 case XmlNodeType.ProcessingInstruction:
70 Console.WriteLine("<?{0} {1}?>", reader.Name, reader.Value);
71 break;
72 case XmlNodeType.Comment:
73 Console.WriteLine("<!--{0}-->", reader.Value);
74 break;
75 case XmlNodeType.XmlDeclaration:
76 Console.WriteLine("<?xml version='1.0'?>");
77 break;
78 case XmlNodeType.Document:
79 break;
80 case XmlNodeType.DocumentType:
81 Console.WriteLine("<!DOCTYPE {0} [{1}]>", reader.Name, reader.Value);
82 break;
83 case XmlNodeType.EntityReference:
84 Console.WriteLine(reader.Name);
85 break;
86 case XmlNodeType.EndElement:
87 Console.WriteLine("</{0}>", reader.Name);
88 break;
89 }
90 }
91 }
92 catch (XmlException ex)
93 {
94 Console.WriteLine(ex.Message);
95 }
96 }
97 }
XmlWriters该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件,优点基本和前者一样。
注意:使用 XmlReader,在调用 Close 方法前,不会读取元素和特性。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 using System.Xml;
2
3 namespace ConsoleApplication1
4 {
5 class Program
6 {
7 static void Main(string[] args)
8 {
9 string path=@"C:\Users\dell\Desktop\test.xml";
10 XmlWriter writer=null;
11 XmlWriterSettings settings = new XmlWriterSettings();
12 settings.Indent = true;
13 settings.IndentChars=("");
14 writer = XmlWriter.Create(path, settings);
15 WriteXml(writer);
16 writer.Close();
17 }
18 private static void WriteXml(XmlWriter writer)
19 {
20 writer.WriteStartElement("books");
21 WriteChildNode(writer, "红楼梦", "曹雪芹", "25");
22 WriteChildNode(writer, "三国演义", "罗贯中", "20");
23 WriteChildNode(writer, "水浒传", "施耐庵", "18");
24 WriteChildNode(writer, "聊斋志异", "蒲松龄", "16");
25 writer.WriteEndElement();
26 }
27 private static void WriteChildNode(XmlWriter writer, string title, string author, string price)
28 {
29 writer.WriteStartElement("book");
30
31 writer.WriteStartElement("title");
32 writer.WriteValue(title);
33 writer.WriteEndElement();
34
35 writer.WriteStartElement("author");
36 writer.WriteValue(author);
37 writer.WriteEndElement();
38
39 writer.WriteStartElement("price");
40 writer.WriteValue(price);
41 writer.WriteEndElement();
42
43 writer.WriteEndElement();
44 }
45 }
46 }
基本用法很简单,就是输出前后开关标签 ,主要使用这三个方法WriteStartElement() writer.WriteValue() WriteEndElement()
注意: XmlWriter 方法输出 XML 时,在调用 Close 方法前,不会写入元素和特性。