第七篇 -- XmlReader 和 XmlWriter
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件。其实,在印象当中,XML很多的操作类都支持直接Save、Read也支持接受XmlReader与XmlWriter类的示例作为参数,但是为什么还要有这个两类来专门用于读写XML文件呢?因为它们有强大的自定义格式功能;
一、XmlReader的使用
XmlReader类专门用于读取Xml文件,最大的特点在于支持Settings。
| 属性 | 说明 |
| AttributeCount | 当在派生类中被重写时,获取当前节点上的属性数 |
| BaseURI | 当在派生类中被重写时,获取当前节点的基 URI |
| CanReadBinaryContent | 获取一个值,该值指示 XmlReader 是否实现二进制内容读取方法 |
| Depth | 获取 XML 文档中当前节点的深度 |
| EOF | 获取一个值,该值指示此读取器是否定位在流的结尾 |
| HasAttributes | 获取一个值,该值指示当前节点是否有任何属性 |
| HasValue | 获取一个值,该值指示当前节点是否可以具有 Value |
| IsDefault | 获取一个值,该值指示当前节点是否是从 DTD 或架构中定义的默认值生成的特性 |
| IsEmptyElement | 获取一个值,该值指示当前节点是否为空元素(例如 <MyElement/>) |
| Item | 获取具有指定索引的属性的值,支持整形,字符串,LocalName 和 NamespaceURI作为参数 |
| LocalName | 获取当前节点的本地名称 |
| Name | 获取当前节点的限定名 |
| NamespaceURI | 获取读取器定位在其上的节点的命名空间 URI |
| NameTable | 获取与该实现关联的 XmlNameTable |
| NodeType | 获取当前节点的类型 |
| Prefix | 获取与当前节点关联的命名空间前缀 |
| QuoteChar | 获取用于括住特性节点值的引号字符 |
| ReadState | 获取读取器的状态 |
| SchemaInfo | 获取作为架构验证结果分配给当前节点的架构信息 |
| Settings | 获取用于创建此 XmlReader 实例的 XmlReaderSettings 对象 |
| Value | 获取当前节点的文本值 |
| ValueType | 获取当前节点的公共语言运行时 (CLR) 类型 |
| XmlLang | 获取当前的 xml:lang 范围 |
| XmlSpace | 获取当前的 xml:space 范围 |
常用方法:
| 方法 | 说明 |
| Close | 将 ReadState 更改为 Closed |
| Create | 使用指定的参数类型创建一个新的 XmlReader 实例 |
| Dispose | 释放由 XmlReader 类的当前实例占用的所有资源 |
| GetAttribute | 当在派生类中被重写时,获取具有指定索引的属性的值 |
| GetValueAsync | 异步获取当前节点的值 |
| IsName | 返回一个值,该值指示字符串参数是否是有效的 XML 名称 |
| IsNameToken | 返回一个值,该值指示该字符串参数是否是有效的 XML 名称标记 |
| IsStartElement | 调用 MoveToContent 并测试当前内容节点是否是开始标记或空元素标记 |
| LookupNamespace | 在当前元素的范围内解析命名空间前缀 |
| MoveToAttribute | 移动到具有指定索引的属性 |
| MoveToContent |
如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。 |
| MoveToElement | 移动到包含当前属性节点的元素 |
| MoveToFirstAttribute | 移动到第一个属性 |
| MoveToNextAttribute | 移动到下一个属性 |
| Read | 从流中读取下一个节点 |
| ReadAttributeValue | 将属性值解析为一个或多个 Text、EntityReference 或 EndEntity 节点 |
| ReadContentAs | 将内容作为指定类型的对象读取 |
| ReadStartElement | 检查当前节点是否为元素并将读取器推进到下一个节点 |
| ReadElementContentAs | 将元素内容作为请求类型读取 |
| ReadElementString | 读取纯文本元素 |
| ReadEndElement | 检查当前内容节点是否为结束标记并将读取器推进到下一个节点 |
| ReadInnerXml | 将所有内容(包括标记)当做字符串读取 |
| ReadOuterXml | 读取表示该节点和所有它的子级的内容(包括标记) |
| ReadString | 将元素或文本节点的内容当做字符串读取 |
| ReadSubtree | 此实例可用于读取当前节点及其所有子节点 |
| ReadToDescendant | 让 XmlReader 前进到下一个具有指定限定名的子代元素 |
| ReadToFollowing | 一直读取,直到找到具有指定限定名的元素 |
| ReadToNextSibling | 让 XmlReader 前进到下一个具有指定限定名的同级元素 |
| ReadValueChunk | 读取嵌入在 XML 文档中的大量文本流 |
| ResolveEntity | 解析 EntityReference 节点的实体引用 |
| Skip | 跳过当前节点的子级 |
示例:

class Program
{
static void Main(string[] args)
{
//<?xml version="1.0" encoding="utf-8"?>
//<Persons>
// <Person>
// <Name>刘备</Name>
// <Age>28</Age>
// </Person>
//</Persons> XmlReader reader = XmlReader.Create(@"D:\123.xml");
reader.ReadString();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "Name")
{
Console.WriteLine(reader.ReadElementString()); //刘备
Console.WriteLine(reader.HasAttributes); //false
}
}
} Console.ReadKey();
}
}

大多数方法和属性的使用方法都和上面的例子相似,不在啰嗦。下面来说说,XmlReader的特色功能,自定义格式,其中最主要用到的是属性Settings。
示例2:

static void Main(string[] args)
{
//<?xml version="1.0" encoding="utf-8"?>
//<Persons>
// <Person>
// <!-- 这是一个牛人 -->
// <Name>刘备</Name>
// <Age>28</Age>
// </Person>
//</Persons> XmlReaderSettings RSetting = new XmlReaderSettings();
RSetting.IgnoreComments = false; //如果设置为true则忽略所有注释 XmlReader reader = XmlReader.Create(@"D:\123.xml", RSetting);
reader.ReadString();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Comment)
{
Console.WriteLine(reader.Value); //这是一个牛人
}
} Console.ReadKey();
}
}

二、XmlWriter的使用
常用属性:
| 属性 | 说明 |
| Settings | 获取用于创建此 XmlWriter 实例的 XmlWriterSettings 对象 |
| WriteState | 当在派生类中被重写时,获取编写器的状态 |
| XmlLang | 当在派生类中被重写时,获取当前的 xml:lang 范围 |
| XmlSpace | 当在派生类中被重写时,获取表示当前 xml:space 范围的 XmlSpace |
常用方法:
| 方法 | 说明 |
| Close | 当在派生类中被重写时,关闭此流和基础流 |
| Create | 使用指定的流创建一个新的 XmlWriter 实例 |
| Dispose | 释放由 XmlWriter 类的当前实例占用的所有资源 |
| Flush | 将缓冲区中的所有内容刷新到基础流,并同时刷新基础流 |
| LookupPrefix | 返回在当前命名空间范围中为该命名空间 URI 定义的最近的前缀 |
| WriteAttributes | 写出在 XmlReader 中当前位置找到的所有属性 |
| WriteAttributeString | 写出具有指定的本地名称和值的属性 |
| WriteBase64 | 将指定的二进制字节编码为 Base64 并写出结果文本 |
| WriteBinHex | 将指定的二进制字节编码为 BinHex 并写出结果文本 |
| WriteCData | 写出包含指定文本的 <![CDATA[...]]> 块 |
| WriteCharEntity | 为指定的 Unicode 字符值强制生成字符实体 |
| WriteChars | 以每次一个缓冲区的方式写入文本 |
| WriteComment | 写出包含指定文本的注释 <!--...--> |
| WriteDocType | 写出具有指定名称和可选属性的 DOCTYPE 声明 |
| WriteElementString | 编写具有指定的本地名称和值的元素 |
| WriteEndAttribute | 关闭上一个 WriteStartAttribute 调用 |
| WriteStartDocument | 编写版本为"1.0"的 XML 声明 |
| WriteEndDocument | 关闭任何打开的元素或属性并将编写器重新设置为 Start 状态 |
| WriteStartElemen | 写入指定的开始标记并将其与给定的命名空间和前缀关联起来 |
| WriteEndElement | 关闭一个元素并弹出相应的命名空间范围 |
| WriteEntityRef | 按 &name; 写出实体引用 |
| WriteFullEndElement | 关闭一个元素并弹出相应的命名空间范围 |
| WriteName | 写出指定的名称,确保它是符合 W3C XML 1.0 建议 |
| WriteNmToken | 写出指定的名称,确保它是符合 W3C XML 1.0 建议 |
| WriteNode | 将所有内容从读取器复制到编写器并将读取器移动到下一个同级的 |
| WriteProcessingInstruction | 写出在名称和文本之间带有空格的处理指令 |
| WriteQualifiedName | 写出命名空间限定的名称。 此方法查找位于给定命名空间范围内的前缀 |
| WriteRaw | 从字符串手动编写原始标记 |
| WriteStartAttribute | 用指定的本地名称编写属性的起点 |
| WriteString | 编写给定的文本内容 |
| WriteSurrogateCharEntity | 为代理项字符对生成并编写代理项字符实体 |
| WriteValue | 编写一个参数中指定的类型的值 |
| WriteWhitespace | 写出给定的空白 |
示例:

static void Main(string[] args)
{
//<?xml version="1.0" encoding="utf-8" standalone="yes"?><Persons><Person><Name>刘备</Name><Age>28</Age></Person></Persons> using (FileStream fs = new FileStream(@"D:\123.xml",FileMode.Create,FileAccess.Write))
{
using (XmlWriter xw = XmlWriter.Create(fs))
{
//XML声明
xw.WriteStartDocument(true);
xw.WriteStartElement("Persons");
xw.WriteStartElement("Person");
xw.WriteStartElement("Name");
xw.WriteString("刘备");
xw.WriteEndElement();
xw.WriteStartElement("Age");
xw.WriteValue();
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndDocument();
}
}
Console.ReadKey();
}

上面的注释就是代码所生成的文档。
上面生成的XML有些问题,没换行,没法看。而且,如果我想去掉XML声明又怎么搞?
示例2:

static void Main(string[] args)
{
//<Persons>
// <Person>
// <Name>刘备</Name>
// <Age>28</Age>
// </Person>
//</Persons> XmlWriterSettings WSetting = new XmlWriterSettings();
//去掉XML声明
WSetting.OmitXmlDeclaration = true;
WSetting.Indent = true; using (FileStream fs = new FileStream(@"D:\123.xml",FileMode.Create,FileAccess.Write))
{
using (XmlWriter xw = XmlWriter.Create(fs, WSetting))
{
//XML声明
xw.WriteStartElement("Persons");
xw.WriteStartElement("Person");
xw.WriteStartElement("Name");
xw.WriteString("刘备");
xw.WriteEndElement();
xw.WriteStartElement("Age");
xw.WriteValue();
xw.WriteEndElement();
xw.WriteEndElement();
xw.WriteEndElement();
}
}
Console.ReadKey();
}

这样生成的XML就又缩进又去掉命名空间了,更多的设置在XmlWriterSettings类的实例中设置。
出处:https://www.cnblogs.com/kissdodog/p/3474807.html
第七篇 -- XmlReader 和 XmlWriter的更多相关文章
- 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)
解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
- 第七篇 Replication:合并复制-订阅
本篇文章是SQL Server Replication系列的第七篇,详细内容请参考原文. 订阅服务器就是复制发布项目的所有变更将传送到的服务器.每一个发布需要至少一个订阅,但是一个发布可以有多个订阅. ...
- 第七篇 Integration Services:中级工作流管理
本篇文章是Integration Services系列的第七篇,详细内容请参考原文. 简介在上一篇文章,我们创建了一个新的SSIS包,学习了SSIS中的脚本任务和优先约束,并检查包的MaxConcur ...
- 第七篇 SQL Server安全跨数据库所有权链接
本篇文章是SQL Server安全系列的第七篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...
- 第七篇 SQL Server代理作业活动监视器
本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...
- 用仿ActionScript的语法来编写html5——第七篇,自定义按钮
第七篇,自定义按钮这次弄个简单点的,自定义按钮.其实,有了前面所定义的LSprite,LBitmap等类,定义按钮就很方便了.下面是添加按钮的代码, function gameInit(event){ ...
- Python之路【第七篇】:线程、进程和协程
Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- [老老实实学WCF] 第七篇 会话
老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...
随机推荐
- Linux简介和各发行版介绍
一.Linux 简介 Linux 内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix 操作系统,是 ...
- JVM一些问题
1. 类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序 答:先静态.先父后子. 先静态:父静态 > 子静态 优先级:父类 > 子类 静态代码块 ...
- 大一0基础小白用最基础C写哥德巴赫猜想
#include <stdio.h>int main (){ int a,b,c,k,count1,count2; for(a=4;a<=1200;a=a+2){ for(b=2;b ...
- 【Rust】Rust的安装和配置
-----------------------参考文档------------------------------------- https://www.rust-lang.org/tools/ins ...
- 这台计算机上缺少此项目引用的Nuget程序包,请参考链接 不给出缺什么包的提示。
这台计算机上缺少此项目引用的Nuget程序包,请参考链接 不给出缺什么包的提示. 解决办法: 1.卸载当前解决类库. 2.编辑当前项目类库文件. 3.删除节点 <Target Name=&q ...
- Java的表达式和运算符
一.算术运算符 运算符 + - * / % 说明 加 减 乘 除 取模(余数) 例子 1+2 5-3 20*5 6/4 30%9 结果 3 2 100 1 3 int x = 10; int y = ...
- @interface __ annotation 子类可以继承到父类上的注解吗--有结论了
博客分类: Java/J2se 作者:赵磊 博客:http://elf8848.iteye.com 不了解注解基础知识的请先看<JDK 5 Annotation\注解\注释\自定义注解> ...
- NET Core 导入web.config配置文件
1.首先需要在NET Core项目中引入System.Configuration.ConfigurationManager,它可以读取web.config中的相关配置信息. 2. 将web.confi ...
- Entity Framework 学习系列(2) - MySql Database First 开发方式
目录 写在前面 环境 下载MySQL连接工具 创建Databse First 1.创建控制台 2.创建数据库 3.安装 MySQL.Data 和MySQL.Data.Entity 3.在项目中添加数据 ...
- ajax 执行成功以后返回的数据走的是error方法而不是success方法的问题
今天在一个功能的时候发现写的ajax的方法执行后台代码成功后返回前台时执行的是error方法而不是success方法,代码如下 jQuery('#form').ajaxSubmit({ type: & ...