使用XmlReader类读取XML文件

转自:http://www.cnblogs.com/ruihua/archive/2007/10/08/917138.html

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属性
CDATACDATA区域
CommentXML注释
Document文档对象,表示XML树的根
DocumentFragment文档片断
DocumentType文档类型声明
Element,EndElement开始元素和结束元素
Entity,EndEntity开始实体声明和结束实体声明
EntityReference实体引用(如&lt;)
None有没有读取节点而查询节点类型时使用
NotationDTD中的符号条目
ProcessingInstructionXML处理指令
SignificantWhitespace在混合内容模型文档中的空白,或者设置了xml:space=preserve时使用
Text元素的文本内容
Whitespace标记之间的空白
XmlDeclaration在文档顶部的XML声明

XmlReaderSettings类的重要属性:
属   性说   明
CheckCharacters允许你获得或者设置用于指示是否执行字符检查的值
ConformanceLevel获得或设置XmlReader对象的符合要求
IgnoreComment允许你获得或设置用于指示是否忽略注释的值
IgnoreProcessingInstruction指定是否忽略处理指令
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 >

说明:以上主要内容摘自《Asp.net 2.0 XML高级编程》

转载于:https://www.cnblogs.com/jerry01/archive/2009/11/26/1611501.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值