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类的实例中设置。
XmlReader/XmlWriter 类的更多相关文章
- C# XmlReader/XmlWriter 类
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件.其实,在印象当中,XML很多的操作类都支持直接Save.Read也支持接受XmlReader与XmlWriter类的示 ...
- C# ~ 从 XML 到 Linq 到 Linq to XML
.XML 可扩展标记语言 (Extensible Markup Language), 标记 (markup) 是关键部分,是标准通用标记语言 (Standard Generalized Markup ...
- LINQ to XML简介
我们的配置文件使用XML存储信息.ADO.NET的DataSet(利用扩展方法)可以方便的将数据保存(或加载)为XML..NET特有的XML API,如XmlReader/XmlWriter类.微端提 ...
- 36、XmlReader与 XMLWriter(抽象类)
一.概述 XMLReader为抽象类,其派生类有:XmlDictionaryReader.XmlNodeReader.XmlTextReader(与IO命名空间中的TextReader对象一起使用). ...
- 第七篇 -- XmlReader 和 XmlWriter
XmlReader用于读取Xml文件,XmlWriter用于将数据写到Xml文件.其实,在印象当中,XML很多的操作类都支持直接Save.Read也支持接受XmlReader与XmlWriter类的示 ...
- XmlWriter/XmlReader示例代码
在Silverlight项目中,如果您想最大程度的减少xap包的大小,仅使用默认System.Xml命名空间下提供的功能来实现“XML序列化/反序列化”,恐怕XmlReader/XmlWriter将成 ...
- 文件读写(二)利用SteamReader和StreamWrite类处理字符串、FileSystemWatcher、BinaryReader/BinaryWriter
一.读写类: TextReader/TextWriter:文本读写,抽象类 TextReader,其派生类: StreamReader:以一种特定的编码从字节流中读取字符. StringReader: ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- PHP配置详解
[PHP] ;;;;;;;;;;;;;;;;;;; ; About php.ini ; ;;;;;;;;;;;;;;;;;;; ; This file controls many aspects of ...
随机推荐
- SyntaxError: Missing parentheses in call to 'print' 这个错误原因是Python版本问题
问题 print "www.baidu.com" Python2 print ("www.baidu.com") Python3 出 ...
- 制作自动化系统安装U盘
1.挂载CentOS6.6镜像 [root@test88 ~]# mkdir /application/tools -p [root@test88 ~]# cd /application/tools/ ...
- redis局域网内开启访问
若需要开启A(192.168.0.3)的访问1.配置confg bind 192.168.0.3 2.设置访问密码 requirepass password 3.重新载入配置 ./redis-serv ...
- C语言 五子棋
#include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> ...
- ISSCC 2017论文导读 Session 14 Deep Learning Processors,DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN
转载请注明,本文出自Bin的专栏http://blog.csdn.net/xbinworld,谢谢! DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN Process ...
- 深度揭秘阿里移动端高性能动态化方案Weex
2016年Qcon大会首日,阿里巴巴资深总监.淘宝移动平台.阿里百川负责人庄卓然宣布移动端高性能动态化方案Weex即时内测,并将于6月开源.此消息一出,群情汹涌,在座的程序猿.攻城狮们纷纷拿起手机扫码 ...
- hive的窗口函数ntile、row_number、rank
一.ntile 序列函数不支持window子句 数据准备: cookie1,--, cookie1,--, cookie1,--, cookie1,--, cookie1,--, cookie1,-- ...
- 【LOJ】 #2009. 「SCOI2015」小凸玩密室
题解 神仙dp啊QAQ 我们发现我们需要枚举一个起点,遍历完它所有的儿子然后向上爬 设\(f[i][j]\)表示第i个点的子树全部处理完之后到达i深度为j的祖先的兄弟处 我们只需要对叶子节点和只有一个 ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- Github 中提交项目到自己仓库的 gh-pages 分支
Github 中提交项目到自己仓库的gh-pages分支 cd cnblogs-theme/ git init git remote add origin git@github.com:hglibin ...