博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#操作Xml:使用XmlReader读Xml
阅读量:6623 次
发布时间:2019-06-25

本文共 2038 字,大约阅读时间需要 6 分钟。

和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO);而在有些场景下我们必须考虑尽可能节省内存和IO的开销,这时候就该XmlReader和XmlWriter出场了。

XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false。

如下读取Xml内容实例代码和注释说明

//玉开技术博客:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Xml;
using
System.IO;
 
namespace
UseXmlReader
{
    
class
Program
    
{
        
static
void
Main(
string
[] args)
        
{
            
//声明StringReader传入Xml文本,作为XmlReader.Create的参数
            
using
(StringReader strRdr =
new
StringReader(
@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<root>
    
<cat color=""white"">I'm a Cat</cat>
    
<dog color=""yellow""/>
</root>"
))
            
{
                
//通过XmlReader.Create静态方法创建XmlReader实例
                
using
(XmlReader rdr = XmlReader.Create(strRdr))
                
{
                    
//循环Read方法直到文档结束
                    
while
(rdr.Read())
                    
{
                        
Console.WriteLine(
"rdr.NodeType = "
+ rdr.NodeType);
                        
//如果是开始节点
                        
if
(rdr.NodeType == XmlNodeType.Element) {
                            
//通过rdr.Name得到节点名
                            
string
elementName = rdr.Name;
                             
                            
Console.WriteLine(elementName +
" element start"
);
                            
if
(elementName ==
"root"
) {
 
                            
}
                            
//读取到cat元素 这时rdr.Read()读取到的内容为<cat color="white">
                            
else
if
(elementName ==
"cat"
)
                            
{
                                
//可以通过中括号获得属性值
                                
string
colorVal = rdr[
"color"
];
                                
Console.WriteLine(
"\tcat's color is "
+ colorVal);
 
                                
//读取到节点内文本内容
                                
if
(rdr.Read()) {
                                    
//通过rdr.Value获得文本内容
                                    
Console.WriteLine(
"\t cat said:"
+ rdr.Value);
                                
}
                            
}
                        
}
                        
else
if
(rdr.NodeType == XmlNodeType.EndElement)
                        
{
                            
//在节点结束时也可以通过rdr.Name获得节点名字
                            
string
elementName = rdr.Name;
                            
Console.WriteLine(elementName +
" element end"
);
                        
}
                    
}
                
}
            
}
 
            
Console.Read();
        
}
    
}
}
如果觉得代码不明白,下面是一张读取顺序图,标明了读取顺序号和每次读取的内容,如下图所示:
从图中可以看到XmlReader在读取这段Xml时:
第1次Read()读取的是Xml文档声明部分
第2次Read()读取的是声明后的空白
第3次Read()读取的是根节点root的开始标签
第4次Read()读取的是根节点开始后的空白
第5次Read()读取的是cat节点的开始部分,从左尖括号到右尖括号包括该节点的属性
第6次读取的是cat节点的内容
第7次读取的是cat节点的结束标签
第8次读取的是cat节点结束标签后的空白
第9次读取的是dog节点的开始部分,注意是从左尖括号开始到结束斜杠之前
第10次读取的是dog标签的结束/>
第11次读取的是dog标签结束后的空白
第12次读取的是root的结束标签

感谢@Kingthy对文中消耗IO说法提出问题,XmlReader和XmlDocument消耗的IO是一样的;不同的是XmlReader可以读取一点,显示一点,而XmlDocument必须完全读入之后才可以开始处理。

C#处理Xml的相关随笔:

1.
2. ,
3.
4.
5.
6.
7.

转载于:https://www.cnblogs.com/itjeff/p/4262585.html

你可能感兴趣的文章
ehcache 使用
查看>>
Objective-C 内存管理
查看>>
Js仿淘宝星级评分
查看>>
DEV GridControl绑定的数据,ID相同的行显示相同的颜色(当ID的值不确定时)
查看>>
android AlertDialog 弹出窗
查看>>
Linux下rz,sz与ssh的配合使用
查看>>
pku 1054 The Troublesome Frog 暴力+剪枝
查看>>
oracle登录数据库样例.txt
查看>>
iOS 文件操作:沙盒(SandBox)、文件操作(FileManager)、程序包(NSBundle)
查看>>
利用Python攻破12306的最后一道防线
查看>>
Android studio 百度地图开发(3)地图导航
查看>>
串行,并行,并发
查看>>
centos svn 的搭建
查看>>
HTML常见元素及其属性总结
查看>>
Android+Jquery Mobile学习系列(1)-开发环境
查看>>
第1章关键角色及其职责——明白职责
查看>>
IOS CoreData 多表查询(下)
查看>>
mysql查询常用小语句
查看>>
mysql 数据库安装步骤个人总结
查看>>
webservice测试工具
查看>>