.NET(C#):XmlReader和Whitespace以及MoveToContent和ReadToFollowing方法
原文 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方法的更多相关文章
- 深入认识XmlReader
深入认识XmlReader 摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作.通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开发中. ...
- 认识XmlReader
认识XmlReader 摘要 XmlReader类是组成.NET的关键技术之一,极大地方便了开发人员对Xml的操作.通过本文您将对XmlReader有一个很好的认识,并将其应用到实际开发中. 目录 ...
- XmlReader读取XML
StringBuilder output = new StringBuilder(); String xmlString = @"<bookstore> <book gen ...
- 初探Net框架下的XML编程技术
一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...
- .NET下XML文件的读写
一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了.本文将指导大家如何运用C#语言完成.Net框架下的X ...
- Linq世界走一走(LINQ TO XML)
前言:Linq to xml是一种使用XML的新方法.从本质上来说,它采用了多种当前使用的XML处理技术,如DOM和XPath,并直接在.NET Framework内将它们组合为一个单一的编程接口.L ...
- Project Web Server PSI 接口一些常用操作
对Project Web Server进行二次开发,每天都把自己折腾到12点以后才休息,到处都是坑,研究那些烦人的PSI,国内根本查不到PSI相关的资料,对照API文档一点点谷歌资料,全部英文资料,开 ...
- git diff ^M的消除
这是由于换行符在不同的操作系统上定义的区别造成的. Windows用CR LF来定义换行,Linux用LF. CR全称是Carriage Return ,或者表示为\r, 意思是回车. LF全称是Li ...
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
随机推荐
- Centos6.5源码编译安装nginx
1.安装pcre下载地址:http://jaist.dl.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.gz #tar -axvf pcre ...
- 转 git操作小结
UNDER MIT LICENSE. 公司几乎所有的项目都是使用 git 仓库来管理代码,以前对 git 只有些肤浅的了解,每次提交代码或者上线的时候总是会提心吊胆,生怕出现一些未知的问题.经过三个月 ...
- Android minHeight/Width,maxHeight/Width
在layout文件中,设置IamgeView的最大(最小)高度(宽度)时,需要同时设置android:adjustViewBounds="true",这样设置才会生效.在代码中设置 ...
- Python进阶之模块与包
模块 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","S ...
- nodejs 文件查找中文,替换为英文
帮以前同事解决一个需求,中文项目 翻译 英文项目~~~ 考虑到具体实现方面的问题,如果智能的话,肯定是要做中文的语法分析,不过感觉这个有难度. 所以最后的方案是遍历文件,将中文短语匹配出来,再进行人工 ...
- 加载loading的ajax写法
ajaxStart()与ajaxStop():当Ajax请求开始时,会触发ajaxStart()方法的回调函数.当Ajax请求结束时,会触发ajaxStop()方法的回调函数.这些方法都是全局的方法, ...
- JAVA并发,BlockingQuene
BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类1.ArrayBlo ...
- CSS---input标签注意
总结一下,在给input标签写CSS时需要注意的有以下几点: 一.不要给属性为text的input标签设置高度,这样无法让IE浏览器下输入框中的文字垂直居中显示.尽管你后来想要通过设置padding属 ...
- ubuntu rc.local 无效 解决方案(转)
为了让mysql开机启动,我将mysql命令添加到/etc/rc.local中,但怎么也运行不了.一开始认为只是/etc/rc.local的权限问题,但通过以下命令修改后,还是不起作用. sudo c ...
- C++中的句柄类
初次在<C++ Primer>看到句柄,不是特别理解.在搜索相关资料后,终于有了点头绪. 首先明白句柄要解决什么问题.参考文章<C++ 沉思录>阅读笔记——代理类 场景: 我们 ...