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

如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。
它跳过以下类型的节点:ProcessingInstruction、DocumentType、Comment、Whitespace 或 SignificantWhitespace

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跳过当前节点的子级

  示例:

C# XmlReader/XmlWriter 类-LMLPHP
    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();
}
}
C# XmlReader/XmlWriter 类-LMLPHP

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

  示例2:

C# XmlReader/XmlWriter 类-LMLPHP
        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();
}
}
C# XmlReader/XmlWriter 类-LMLPHP

二、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写出给定的空白

  示例:

C# XmlReader/XmlWriter 类-LMLPHP
        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();
}
C# XmlReader/XmlWriter 类-LMLPHP

  上面的注释就是代码所生成的文档。

  上面生成的XML有些问题,没换行,没法看。而且,如果我想去掉XML声明又怎么搞?

  示例2:

C# XmlReader/XmlWriter 类-LMLPHP
        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();
}
C# XmlReader/XmlWriter 类-LMLPHP

  这样生成的XML就又缩进又去掉命名空间了,更多的设置在XmlWriterSettings类的实例中设置。

 
 
 
绿色通道: 与我联系 C# XmlReader/XmlWriter 类-LMLPHP
1
0
 
(请您对文章做出评价)
 
04-14 09:34