基于C#中XmlReader读取Xml的深入分析
- 作者: 太阳渡河而来
- 来源: 51数据库
- 2021-10-19
xmldocument和xelement在读取xml时要将整个xml文档放到内存中去操作,这样做操作简单,但是很费内存,而在有些场景下我们必须考虑尽可能节省内存.这时候就该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的结束标签
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的结束标签
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0