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