.NET(C#):XmlReader和Whitespace以及MoveToContent和ReadToFollowing方法

  1. 云栖社区>
  2. 博客>
  3. 正文

.NET(C#):XmlReader和Whitespace以及MoveToContent和ReadToFollowing方法

杰克.陈 2013-10-15 13:42:00 浏览656
展开阅读全文

原文 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是始终保留的。

网友评论

登录后评论
0/500
评论
杰克.陈
+ 关注