天天看點

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

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:Comment              Name:

NodeType:Element              Name:file

NodeType:Element              Name:file.attr

NodeType:Text                 Name:

NodeType:EndElement           Name:file.attr

NodeType:EndElement           Name:file

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))

{ }

檢查目前節點是否是内容(非空白文本、CDATA、Element、EndElement、EntityReference 或 EndEntity)節點。 如果此節點不是内容節點,則讀取器向前跳至下一個内容節點或檔案結尾。 它跳過以下類型的節點:ProcessingInstruction、DocumentType、Comment、Whitespace 或 SignificantWhitespace。

代碼:

    {

        xr.MoveToContent();

    }

輸出:

Whitespace和注釋都沒了。

注意不要和XmlReader的兩個其他的方法混淆:MoveToAttribute和MoveToElement,這兩個是在XML元素和屬性之間的移動。

另外許多XmlReader的讀取操作内部會調用MoveToContent方法,比如ReadElementString,ReadStartElement,ReadEndElement……

第三個要說的方法是MoveToFollowing方法,這個方法會一直讀下去直到指定名稱的元素被找到。這樣的話我們直接去找需要的節點而直接省略那些Whitespace或者注釋。

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

    xr.ReadToFollowing("file.attr");

    Console.WriteLine(xr.ReadElementString());

    //讀取元素内的XML文本

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

hidden

a.txt

注意XML元素内的文位元組點的Whitespace是始終保留的。