原文 http://www.cnblogs.com/mgen/archive/2012/04/26/2471403.html

XmlReader默认是读取XML文件中的Whitespace和注释的。

比如这个XML:

<root>

<!-- root中 -->

<file>

<file.attr>hidden</file.attr>

a.txt

</file>

</root>

XmlReader读取代码:

//data.xml代表上面的XML文件

using (var xr =XmlReader.Create("data.xml"))

{

while (xr.Read())

Console.WriteLine("NodeType:{0,-20} Name:{1}", xr.NodeType, xr.Name);

}

将会输出:

NodeType:XmlDeclaration       Name:xml

NodeType:Whitespace           Name:

NodeType:Element              Name:root

NodeType:Whitespace           Name:

NodeType:Comment              Name:

NodeType:Whitespace           Name:

NodeType:Element              Name:file

NodeType:Whitespace           Name:

NodeType:Element              Name:file.attr

NodeType:Text                 Name:

NodeType:EndElement           Name:file.attr

NodeType:Text                 Name:

NodeType:EndElement           Name:file

NodeType:Whitespace           Name:

NodeType:EndElement           Name:root

可以看到,Whitespace和注释都被读了进来。

解决方案之一就是在XmlReaderSettings中将IgnoreWhitespace和IgnoreComments设置为True(默认当然是False),然后再创建XmlReader:

var xrs =newXmlReaderSettings();

xrs.IgnoreComments =true;

xrs.IgnoreWhitespace =true;

using (var xr =XmlReader.Create("data.xml", xrs))

{ }

还可以使用XmlReader的MoveToContent方法,可以参考MSDN的全面解释(http://msdn.microsoft.com/zh-cn/library/system.xml.xmlreader.movetocontent.aspx):

检查当前节点是否是内容(非空白文本、CDATA、Element、EndElement、EntityReference 或 EndEntity)节点。 如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。 它跳过以下类型的节点:ProcessingInstruction、DocumentType、Comment、Whitespace 或 SignificantWhitespace。

代码:

//data.xml代表上面的XML文件

using (var xr =XmlReader.Create("data.xml"))

{

while (xr.Read())

{

xr.MoveToContent();

Console.WriteLine("NodeType:{0,-20} Name:{1}", xr.NodeType, xr.Name);

}

}

输出:

NodeType:Element              Name:root

NodeType:Element              Name:file

NodeType:Element              Name:file.attr

NodeType:Text                 Name:

NodeType:EndElement           Name:file.attr

NodeType:Text                 Name:

NodeType:EndElement           Name:file

NodeType:EndElement           Name:root

Whitespace和注释都没了。

注意不要和XmlReader的两个其他的方法混淆:MoveToAttribute和MoveToElement,这两个是在XML元素和属性之间的移动。

另外许多XmlReader的读取操作内部会调用MoveToContent方法,比如ReadElementString,ReadStartElement,ReadEndElement……

第三个要说的方法是MoveToFollowing方法,这个方法会一直读下去直到指定名称的元素被找到。这样的话我们直接去找需要的节点而直接省略那些Whitespace或者注释。

代码:

//data.xml代表上面的XML文件

using (var xr =XmlReader.Create("data.xml"))

{

//使用ReadToFollowing读至file.attr元素

xr.ReadToFollowing("file.attr");

Console.WriteLine(xr.ReadElementString());

//读取元素内的XML文本

Console.WriteLine(xr.ReadString().Trim());

}

输出:

hidden

a.txt

注意XML元素内的文字节点的Whitespace是始终保留的。

.NET(C#):XmlReader和Whitespace以及MoveToContent和ReadToFollowing方法的更多相关文章

  1. 深入认识XmlReader

      深入认识XmlReader 摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作.通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开发中. ...

  2. 认识XmlReader

    认识XmlReader   摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作.通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开发中. 目录 ...

  3. XmlReader读取XML

    StringBuilder output = new StringBuilder(); String xmlString = @"<bookstore> <book gen ...

  4. 初探Net框架下的XML编程技术

    一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...

  5. .NET下XML文件的读写

    一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...

  6. Linq世界走一走(LINQ TO XML)

    前言:Linq to xml是一种使用XML的新方法.从本质上来说,它采用了多种当前使用的XML处理技术,如DOM和XPath,并直接在.NET Framework内将它们组合为一个单一的编程接口.L ...

  7. Project Web Server PSI 接口一些常用操作

    对Project Web Server进行二次开发,每天都把自己折腾到12点以后才休息,到处都是坑,研究那些烦人的PSI,国内根本查不到PSI相关的资料,对照API文档一点点谷歌资料,全部英文资料,开 ...

  8. git diff ^M的消除

    这是由于换行符在不同的操作系统上定义的区别造成的. Windows用CR LF来定义换行,Linux用LF. CR全称是Carriage Return ,或者表示为\r, 意思是回车. LF全称是Li ...

  9. 【转】 Android 开发 之 JNI入门 - NDK从入门到精通

    原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub  ...

随机推荐

  1. Extjs Store 的用法详解

    Ext.data.Store的基本用法 在使用之前,首先要创建一个Ext.data.Store的实例,如下面的代码所示.       每个store最少需要两个组件的支持,分别是proxy和reade ...

  2. 定时自动备份mysql数据库

    新建备份文件并赋予可以执行的权限 mkdir -p /home/mysql_backup/ touch /home/mysql_backup/mysql_backup.sh chmod 551 /ho ...

  3. FAQ:Python中*args和**agrs的区别

    python提供了两种特别的方法来定义函数的参数: 1. 位置参数 *args,  把参数收集到一个元组中,作为变量args   >>>def show_args(*args):   ...

  4. SQL Server 查看数据页面

    第一步: 找到表的第一页dbcc ind(db_name,table_name,-1); 例子. dbcc ind(studio,person,-1);# pageFID  是文件号   pagePI ...

  5. Umbraco Content属性

    总算是有个内容还算多的Content的属性介绍,保存一下. https://our.umbraco.org/documentation/Reference/Management-v6/Models/C ...

  6. dom元素和方法总结

    主要是参考<精通javascript>. 全局变量有: document.这个变量包含浏览器的html dom文档的引用. HTMElement 这个变量是所要html dom 元素的超类 ...

  7. 九度OJ 题目1534:数组中第K小的数字(二分解)

    题目链接:点击打开链接 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6 ...

  8. 单机Oracle+asm(11.2.0.3.0) Patch Set Update(11.2.0.3.7 )

    之前写过一篇关于PSU升级的案例,参考如下: http://blog.csdn.net/jyjxs/article/details/8983880 但是,感觉有些地方理解的不是很透彻明白,照猫画虎的比 ...

  9. Android 天天爱消除辅助

    简介 <天天爱消除>是一款移植于手游的消除类益智游戏,该游戏只有通过手机登录QQ跟微信才能进行,这样一来这款游戏必然会大红大紫. 功能 开发Android自动化触屏事件,录制操作脚本,实现 ...

  10. findOneAndUpdate的用法详解

    Fragment.findOneAndUpdate({_id:id}, {$set: datas}, {upsert:true, 'new':true}).populate('ads').exec(f ...