C#中如何使用 XmlReader 读取XML文件
xmlreader通过向前读取文档并识别读取到的元素,为我们提供了一种消耗资源最少的方式来解析xml数据。很多时候我们都是利用xmlreader来对xml文件的数据有效性进行验证(使用xmlreader实例的read()方法依次读取所有节点,以此判断是否与符合指定的模式)。使用这种非缓存、只读、只向前的方式,每次读取只将很少的数据放入内存,对内存的占用量较小,对于读取内容较大的xml文件不失为一种最佳的选择。
让我们看看xmlreader类读取xml文件的步骤:
1、使用xmlreader类的create()工厂方法创建该类的一个实例,并将被读取的xml文件名作为参数传入方法;
2、建立一个反复调用read()方法的循环。这个方法从文件的第一个节点开始,然后读取所有余下的节点,但每次调用只读取一个节点。如果存在一个节点可被读取则返回true,而当到达文件最后时则返回false;
3、在这个循环中,将检查xmlreader实例的属性和方法,以获得关于当前节点的信息(节点的类型、名称、数据等)。不断执行循环直到read()返回false;
下面首先看一个示例:
employees.xml文件:
<?xml version='1.0'?> <employees> <employee id="1"> <name> <firstname>nancy</firstname> <lastname>davolio</lastname> </name> <city>seattle</city> <state>wa</state> <zipcode>98122</zipcode> </employee> <employee id="2"> <name> <firstname>andrew</firstname> <lastname>fuller</lastname> </name> <city>tacoma</city> <state>wa</state> <zipcode>98401</zipcode> </employee> </employees>
aspx代码:
<%@ page language="c#" %> <%@ import namespace="system.xml" %> <script runat="server"> void page_load(object sender, eventargs e) { //location of xml file string xmlfilepath = server.mappath("~/employees.xml"); try { using (xmlreader reader = xmlreader.create(xmlfilepath)) { string result; while (reader.read()) { //process only the elements if (reader.nodetype == xmlnodetype.element) { result = ""; for (int count = 1; count <= reader.depth; count++) { result += "==="; } result += "=> " + reader.name + "<br/>"; lblresult.text += result; } } } } catch (exception ex) { lblresult.text = "an exception occurred: " + ex.message; } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>reading an xml file using xmlreader</title> </head> <body> <form id="form1" runat="server"> <div> <asp:label id="lblresult" runat="server" /> </div> </form> </body> </html>
输出结果:
=> employees
====> employee
=======> name
==========> firstname
==========> lastname
=======> city
=======> state
=======> zipcode
====> employee
=======> name
==========> firstname
==========> lastname
=======> city
=======> state
=======> zipcode
下面让我们看看xmlreader类的属性和方法:
属 性 | 说 明 |
---|---|
attributecount | 返回当前节点的属性个数 |
depth | 返回当前节点的深度,用于判断指定的节点是否具有子节点 |
eof | 判断读取器是否位于流的末端 |
hasattribute | 返回指示当前节点是否具有属性的布尔值 |
hasvalue | 返回指示当前节点是否具有值的布尔值 |
isemptyelement | 判断当前节点是否是一个空元素 |
localname | 返回当前节点的本地名称 |
name | 返回当前节点的限定名称 |
namespaceuri | 返回当前节点的命名空间uri |
nodetype | 以xmlnodetype枚举的形式返回当前节点的节点类型 |
prefix | 返回与当前节点相关的命名空间前缀 |
readstate | 以readstate枚举的形式返回读取器的当前状态 |
settings | 返回用于创建xmlreader实例的xmlreadersettings对象 |
value | 返回当前节点的值 |
valuetype | 获得当前节点的clr类型 |
xmlreader类的重要方法:
方 法 | 说 明 |
---|---|
close | 通过将readstate枚举设置为closed来关闭xmlreader对象 |
create | 创建xmlreader对象的实例并将其返回给调用程序 |
getattribute | 获得属性的值 |
isstartelement | 指示当前节点是否是开始标签 |
movetoattribute | 移动读取器到指定的属性 |
movetocontent | 如果当前节点不是内容节点,则移动读取器至下一个内容节点 |
movetoelement | 移动读取器至包含当前属性的元素;用于列举属性以及想切换至包含所有这些属性的元素 |
movetofirstattribute | 移动读取器至当前节点的第一个属性 |
movetonextattribute | 移动读取器至当前节点的下一个属性 |
read | 从流中读取下一个节点 |
readcontentas | 读取提供类型的对象的内容 |
readelementcontentas | 读取当前元素并返回指定类型对象的内容 |
readendelement | 移动读取器越过当前结束标签并移动到下一个节点 |
readinnerxml | 以字符串的形式读取包括标记在内的当前节点所有内容 |
readoutxml | 读取包括当前节点标记和子节点在内的节点的内容 |
readtodescendant | 移动读取器至下一个匹配子孙元素的节点 |
readtofollowing | 不断读取直至找到指定的元素 |
readtonextslibing | 移动读取器至下一个匹配兄弟元素的节点 |
readvaluechunk | 允许读取嵌入在xml文档中的大型文本流 |
xmlnodetype枚举的成员:
成 员 | 说 明 |
---|---|
attribute | 属性 |
cdata | cdata区域 |
comment | xml注释 |
document | 文档对象,表示xml树的根 |
documentfragment | 文档片断 |
documenttype | 文档类型声明 |
element,endelement | 开始元素和结束元素 |
entity,endentity | 开始实体声明和结束实体声明 |
entityreference | 实体引用(如<) |
none | 有没有读取节点而查询节点类型时使用 |
notation | dtd中的符号条目 |
processinginstruction | xml处理指令 |
significantwhitespace | 在混合内容模型文档中的空白,或者设置了xml:space=preserve时使用 |
text | 元素的文本内容 |
whitespace | 标记之间的空白 |
xmldeclaration | 在文档顶部的xml声明 |
xmlreadersettings类的重要属性:
属 性 | 说 明 |
---|---|
checkcharacters | 允许你获得或者设置用于指示是否执行字符检查的值 |
conformancelevel | 获得或设置xmlreader对象的符合要求 |
ignorecomment | 允许你获得或设置用于指示是否忽略注释的值 |
ignoreprocessinginstruct |
指定是否忽略处理指令 |
ignorewhitespace | 指定是否忽略无意义的空格 |
prohibitdtd | 指定是否允许dtd处理 |
schemas | 指定在执行xml验证时使用的xmlschemaset |
validationflags | 获得或者设置用于指定模式验证设置的值 |
validationtype | 获得或者设置用于指定所执行的验证类型的值 |
xmlresolver | 设置用于访问外部文档的xmlreslover |
通过xmlreadersettings类,你可以指定一系列由xmlreader对象支持的功能,为此,只需将xmlreadersettings作为参数传入xmlreader的create()方法中即可。如下所示:
<script runat="server"> void page_load(object sender, eventargs e) { string xmlfilepath = server.mappath("~/employees.xml"); //create the xmlreadersettings object and set appropriate properties xmlreadersettings settings = new xmlreadersettings(); settings.ignorecomments = true; settings.ignorewhitespace = true; try { //get reference to the xmlreader object using (xmlreader reader = xmlreader.create(xmlfilepath, settings)) { string result; while (reader.read()) { //process only the elements if (reader.nodetype == xmlnodetype.element) { //reset the variable for a new element result = ""; for (int count = 1; count <= reader.depth; count++) { result += "==="; } result += "=> " + reader.name + "<br/>"; lblresult.text += result; } } } } catch (exception ex) { lblresult.text = "an exception occurred: " + ex.message; } } </script>
总结下来,我们可以使用xmlreader类以非缓存、只读、只向前的方式读取xml文件,这种方法占用内存少,推荐大家使用。
上一篇: C#清除WebBrowser中Cookie缓存的方法
下一篇: php连接sftp的作用以及实例代码
推荐阅读
-
C#中如何使用 XmlReader 读取XML文件
-
C#操作xml文件:使用XmlDocument 实现读取和写入
-
如何从xml文件中批量读取数据?
-
C# 如何在WINForm程序中创建XML文件
-
c#使用Dataset读取XML文件动态生成菜单的方法
-
C#中如何使用 XmlReader 读取XML文件
-
如何 在Spring MVC中 使用多个Spring和MyBatis的xml配置文件(多模块配置)
-
C#如何使用Reflect获取dll文件中的类型并调用?
-
C#如何使用Reflect获取dll文件中的类型并调用?
-
Eclipse与IDEA中如何正确的放置需要读取的文件来成功使用相对路径(java)