36、XmlReader与 XMLWriter(抽象类)
一、概述
XMLReader为抽象类,其派生类有:XmlDictionaryReader、XmlNodeReader、XmlTextReader(与IO命名空间中的TextReader对象一起使用)、XmlValidatingReader(添加了DTD和模式验证,提供数据的有效性验证)。
- XmlReader reader =new XmlTextReader(xmlFile);
- XmlReader reader =new XmlNodeReader(xmNode);
XMLWriter为抽象类,其派生类有XmlTextWriter与XmlQueryWriter类。
二、XMLReader
1、概述
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存。而在有些场景下我们必须考虑尽可能节省内存,这时候就该XmlReader和XmlWriter出场了。
XmlReader非常类似于SAX。它们最大的区别是SAX是一种推模型(所有XML数据都必须由应用程序 处理,无论是否需要这些数据),XmlReader是一种拉模型(如果不需要所有的数据,就不需要处理它们)。
XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false。
2、用法
(1)使用静态方法Create(),返回一个XmlReader对象。
(2)Read()方法可以进入下一个节点。
XmlReader类还可以读取强类型化的数据,它有几个ReadValuesAs方法,如、ReadValueAsDouble、ReadValueAsBoolean等。
3、检索属性数据
AttributeCountry属性确定属性个数。GetAttribute()方法按照名称或索引来获取属性,如果要一次迭代一个属性就可以使用MoveToFirstAttribute()和MoveToNextAttribute()方法。
XmlReader tr = XmlReader.Create("book.xml");
while (tr.Read()){
if (tr.NodeType == XmlNodeType.Element){
; i < tr.AttributeCount; i++){
richTextBox1.AppendText(tr.GetAttribute(i)+"\r\n");
}
}
}
4、使用XmlReader类进行验证
有时不但要知道文档的格式是规范的,还是确定文档是有效的。
XmlReader可以使用XmlReaderSettings,根据XSD模式验证XML。XSD模式添加到XMLSchemaSet中,通过Schema属性可以访问XMLSchemaSet。XsdValidate属性还必须设置为ture,这个属性默认为flase.
5、举例:
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.IgnoreWhitespace = true;
XmlReader reader = XmlReader.Create("Customer2.xml", settings);//settings参数 为可选。
List<CustomerInfo> lists = new List<CustomerInfo>();
CustomerInfo cust = null;
while (reader.Read())//读取下一个节点
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "row":
cust = new CustomerInfo();
if (reader.HasAttributes)//因属性不是文档结构的一部分,要专门检查。属性HasValue是否有值;IsEmptyElement:是否为空元素
{
cust.AppId = reader.GetAttribute("AppID");
cust.Version = reader.GetAttribute("Version");
}
break;
case "CustomerID":
cust.CustomerID = reader.ReadString();
break;
case "CompanyName":
cust.CompanyName = reader.ReadString();
break;
default:
break;
}
}
}
6、读取字节数据
下面的示例读取一个内联 BinHex 编码图像。 BinHex 数据嵌入到 <image> 元素中。 BinaryWriter 用于创建一个新的二进制数据文件。
public static void BinHexDecodeImageFile() {
];
;
using (XmlReader reader = XmlReader.Create("output.xml")) {
FileStream outputFile = new FileStream(@"C:\artFiles\data\newImage.jpg", FileMode.OpenOrCreate,
FileAccess.Write, FileShare.Write);
// Read to the image element.
reader.ReadToFollowing("image");
// Read the BinHex data.
Console.WriteLine("\r\nReading BinHex...");
BinaryWriter bw = new BinaryWriter(outputFile);
, ))>) {
bw.Write(buffer, , readBytes);
}
outputFile.Close();
}
}
三 、XMLWriter
与XmlReader一样,XmlWriter类以只向前、未缓存的方式 进行写入。
1.如何使用XmlWriter写Xml文档声明
// WriteStartDocument方法可以接受一个bool参数(表示standalone,是否为独立文档)或者不指定参数standalone保持默认值
xmlWriter.WriteStartDocument(false|true);
注意在使用WriteStartDocument方法后最好调用xmlWrite.WriteEndDocument()方法来关闭所有可能未关闭标签
2.如何使用XmlWriter写xml节点以及属性
//写节点
xmlWriter.WriteStartElement("cat");
//给节点添加属性
xmlWriter.WriteAttributeString("color", "white");
//给节点内部添加文本
xmlWriter.WriteString("I'm a cat");
xmlWriter.WriteEndElement();
或者通过WriteElementString(string,string)方法写xml节点同时写下节点值,如下
xmlWriter.WriteElementString("pig", "pig is great");
3.如何写CData
xmlWriter.WriteCData("<strong>dog is dog</strong>");
4.如何使用XmlWriter添加注释
xmlWriter.WriteComment("*** ");
5.如何设置XmlWriter的输出格式,解决输出UTF-16问题
设置xml输出格式,需要通过XmlWriterSettings类,如下代码
XmlWriterSettings settings = new XmlWriterSettings();
//要求缩进
settings.Indent = true;
//注意如果不设置encoding默认将输出utf-16
//注意这儿不能直接用Encoding.UTF8如果用Encoding.UTF8将在输出文本的最前面添加4个字节的非xml内容
settings.Encoding = new UTF8Encoding(false);
//设置换行符
settings.NewLineChars = Environment.NewLine;
6、写入其他对象中
XmlWriter类可以把Xml写入一个流、文件、StringBuilder、TextWriter或另一个XmlWriter对象中。
7、命名空间的支持
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("abc","urn:1","xyz");
w.WriteEndElement();
w.WriteEndElement();
w.Close();
8、完整的代码示例如下:
XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = "\t"; settings.NewLineOnAttributes = false; settings.ConformanceLevel = ConformanceLevel.Auto; settings.OmitXmlDeclaration = false;
//注意如果不设置encoding默认将输出utf-16 //注意这儿不能直接用Encoding.UTF8如果用Encoding.UTF8将在输出文本的最前面添加4个字节的非xml内容 settings.Encoding = new UTF8Encoding(false);
//设置换行符 settings.NewLineChars = Environment.NewLine;
XmlWriter writer = XmlWriter.Create("CustomerNewElementArribute.xml", settings);//settings参数 为可选。
// 使用xmlwriter写入StringBuiler和Stream:
// StringBuilder builder = new StringBuilder();
// XmlWriter writer = XmlWriter.Create(builder, settings);
//MemoryStream stream = new MemoryStream();
//XmlWriter writer = XmlWriter.Create(stream, settings);
writer.WriteStartDocument();//写Xml声明:可选参数表示standalone,是否为独立文档
writer.WriteComment("XXX"); //写注释<!--和-->
writer.WriteStartElement("Table");//写复杂元素(元素含有子元素)
; i < ; i++)
{
writer.WriteStartElement("row");
writer.WriteAttributeString("Version", "2.0");
writer.WriteAttributeString(");
writer.WriteElementString("CustomerID", "cmz" + i.ToString());//写简单元素
writer.WriteElementString("CompanyName", "程沐喆" + i.ToString());
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
writer.Close();
9、用 WriteBinHex 方法编写 BinHex 数据
//用 WriteBinHex 方法编写 BinHex 数据。 BinHex 数据嵌入在 <image> 元素。
;
byte[] buffer = new byte[bufferSize];
;
using (XmlWriter writer = XmlWriter.Create("output.xml"))
{
FileStream inputFile = new FileStream(@"C:\sunset.jpg", FileMode.OpenOrCreate,
FileAccess.Read, FileShare.Read);
writer.WriteStartDocument();
writer.WriteStartElement("image");
BinaryReader br = new BinaryReader(inputFile);
Console.WriteLine("\r\nWriting BinHex data...");
do
{
readBytes = br.Read(buffer, , bufferSize);
writer.WriteBinHex(buffer, , readBytes);
} while (bufferSize <= readBytes);
br.Close();
writer.WriteEndElement();// </image>
writer.WriteEndDocument();
}
36、XmlReader与 XMLWriter(抽象类)的更多相关文章
- C#操作XMl文件(2):使用XmlReader和XmlWriter实现读取和写入
这次使用操作Xml较为常用的方法:使用XMlreader和Xmlwriter 1:读取xml文件的数学和元素 XmlReaderSettings settings = new XmlReaderSet ...
- 第七篇 -- XmlReader 和 XmlWriter
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件.其实,在印象当中,XML很多的操作类都支持直接Save.Read也支持接受XmlReader与XmlWriter类的示 ...
- xmlreader与xmlwriter里的几个坑与解决方案
加载超过100M的xml文件时(可能不是很常见),XmlDocument这种全部加载到内存里的模式就有点不友好了,耗时长.内存高. 这时用xmlreader就会有自行车换超跑的感觉,但其间遇到几个坑, ...
- C# XmlReader/XmlWriter 类
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件.其实,在印象当中,XML很多的操作类都支持直接Save.Read也支持接受XmlReader与XmlWriter类的示 ...
- XmlReader/XmlWriter 类
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件.其实,在印象当中,XML很多的操作类都支持直接Save.Read也支持接受XmlReader与XmlWriter类的示 ...
- 使用XmlReader读Xml
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO):而在有些场景下我们必须考虑尽可能节省内存和I ...
- C#操作Xml:使用XmlReader读Xml
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO):而在有些场景下我们必须考虑尽可能节省内存和I ...
- paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
- xml操作
一.LINQ to XML 编程基础 1.LINQ to XML类 System.Xml.Linq命名空间含有19个类,下表列出了它们的名称及其描述: 类 描述 XAttribute 表示一个 XML ...
随机推荐
- PgAdmin4连接数据库报错:Unable to connect to server: ERROR: unrecognized configuration parameter "bytea_output"
原因: PgAdmin 4不再支持PostgreSQL 9.0 和更早的版本 我的版本是8.2.15 template1=# select version(); version ----------- ...
- get/post 接口调用
content-type: application/~~~~~ /// <summary> /// Post数据到网站 /// </summary> /// <para ...
- DataGridView 直接修改数据操作
DataGridView单元格进入编辑模式的方法: 双击或者f2: EditCellOnEnter 属性设为True,对DataGridView进行配置,当用户移动到该单元格后,该单元格可立即切换到编 ...
- c#之泛型详解(Generic)
这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用. 一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非 ...
- Vs2015+opencv2.4.10出现msvcp120d.dll丢失 opencv2410.props
今天vs2015配置好opencv编译运行会报错msvcp120d.dll丢失,只要把这个文件复制到你在第一步设置的Path环境变量路径里,和opencv的dll放在一起就行了.(初次配置完环境变量后 ...
- 阿里云服务器(Ubuntu16.04 64位)远程连接
购买阿里云服务器 1.打开阿里云官方网站,账号登录,选择产品中的云服务器 ECS 2.根据自身需求,选择合适的阿里云服务器系统,(1)点击一键购买,(2)选择地域,(3)根据自身需求,选择系统,这里选 ...
- android LinearLayout
Android的布局方式共有6种,分别是LinearLayout(线性布局).TableLayout(表格布局).FrameLayout(帧布局).RelativeLayout(相对布局).GridL ...
- Java基础教程(5)--变量
一.变量 1.变量的定义 正如上一篇教程<Java基础教程(4)--面向对象概念>中介绍的那样,对象将它的状态存在域中.但是你可能仍然有一些疑问,例如:命名一个域的规则和惯例是什么?除 ...
- win下gosublime配置ctag
ctags(Generate tag files for source code)是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM.并且VIM中已经默认安装 ...
- redux实现原理
redux基本概念 基本概念 1.store 用来保存数据的地方,使用createStore来生成数据 store = createStore(fn) 2.state,通过拷贝store中的数据得到 ...