您的位置:首页 > 编程语言 > C#

C#中基于流的XML文件操作笔记

2018-10-12 14:09 806 查看

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 方法前,不会写入元素和特性。

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: