明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在.NET Framework中簡單處理XML數(shù)據(jù)(4-1)

[摘要]XmlTextWriter類 用在本節(jié)中的方法創(chuàng)建XML文檔顯然并不困難。多年以來,開發(fā)者都是通過在緩存在連接一些字符串,連接好以后再把緩存中字符串輸出到文件的方式來創(chuàng)建XML文檔。但是以這種方式創(chuàng)建XML文檔的方法只有在你保證字符串中不存在任何細小的錯誤的時候才有效。.NET Frame...
XmlTextWriter類

用在本節(jié)中的方法創(chuàng)建XML文檔顯然并不困難。多年以來,開發(fā)者都是通過在緩存在連接一些字符串,連接好以后再把緩存中字符串輸出到文件的方式來創(chuàng)建XML文檔。但是以這種方式創(chuàng)建XML文檔的方法只有在你保證字符串中不存在任何細小的錯誤的時候才有效。.NET Framework通過用XMLwriter提供了更好的創(chuàng)建XML文檔的方法。

XML Writer類以只前(forward-only)的方式輸出XML數(shù)據(jù)到流或者文件中。更重要的是,XML Writer在設(shè)計時就保證所有的XML數(shù)據(jù)都符合W3C XML 1.0推薦規(guī)范,你甚至不用擔心忘記寫閉標簽,因為XML Writer會幫你寫。XmlWriter是所有 XML writer的抽象基類。.NET Framework只提供唯一的一個writer 類----XmlTextWriter類。

我們先來看看XML writers和舊的writers的不同點,下面的代碼保存了一個string型的數(shù)組:

StringBuilder sb = new StringBuilder("");

sb.Append("");

foreach(string s in theArray) {

sb.Append("

sb.Append(s);

sb.Append("\"/>");

}

sb.Append("
");

代碼通過循環(huán)取出數(shù)據(jù)中的元素,寫好標簽文本并把它們累加到一個string中。代碼保證輸出的內(nèi)容是格式良好的并且注意了新行的縮進,及支持命名空間。當創(chuàng)建的文檔結(jié)構(gòu)比較簡單時,這種方法可能不會有錯誤。然而,當你要支持處理指令,命名空間,縮進,格式化以及實體的時候,代碼的數(shù)量就成指數(shù)級增長,出錯的可能性也隨之增長。

XML writer寫方法功能對應(yīng)每個可能的XML節(jié)點類型,它使創(chuàng)建xml文檔的過程更符合邏輯、更少的信賴于繁瑣的標記語言。圖六演示了怎么樣用XmlTextWriter類的方法來連接一個string數(shù)據(jù)。代碼很簡潔,用XML writer的代碼更容易讀、結(jié)構(gòu)更好。

Figure 6 Serializing a String Array

void CreateXmlFileUsingWriters(String[] theArray, string filename)

{

// Open the XML writer (用默認的字符集)

XmlTextWriter xmlw = new XmlTextWriter(filename, null);

xmlw.Formatting = Formatting.Indented;



xmlw.WriteStartDocument();

xmlw.WriteStartElement("array");

foreach(string s in theArray)

{

xmlw.WriteStartElement("element");

xmlw.WriteAttributeString("value", s);

xmlw.WriteEndElement();

}

xmlw.WriteEndDocument();



// Close the writer

xmlw.Close();

}

然而XML writer并不是魔術(shù)師----它不能修復輸入的錯誤。XML writer不會檢查元素名和屬性名是否有效,也不保證被用的任何的Unicode字符集適合當前架構(gòu)的編碼集。如上所述,為了避免輸出錯誤,必須要杜絕非XML字符。但是writer沒有提供這種方法。

另外,當創(chuàng)建一個屬性節(jié)點時,Writer不會檢驗屬性節(jié)點的名稱是否與已存在的元素節(jié)點的名稱相同。最后,XmlWriter類不是一個帶驗證的Writer類,也不保證輸出是否符合schema或者DTD。在.NET Framework中帶驗證的writer類目前來說還沒有提供。但是在我寫的《Applied XML Programming for Microsoft .NET (Microsoft Press®, 2002)》書中,我自己寫了一個帶驗證的Writer組件。你可以到下面的網(wǎng)址去下載源碼:http://www.microsoft.com/MSPress/books/6235.asp.

圖七列出了XML writer的一些狀態(tài)值(state)。這些值都源于WriteState枚舉類。當你創(chuàng)建一個Writer,它的初始狀態(tài)為Start,表示你將要配置該對象,實際上writer沒有開始。下一個狀態(tài)是Prolog,該狀態(tài)是當你調(diào)用WriteStartDocument方法開始工作的時候設(shè)置的。然后,狀態(tài)的轉(zhuǎn)換就取決于你的寫的文檔及文檔的內(nèi)容了。Prolog狀態(tài)一直保留到當你增加一個非元素節(jié)點時,例如注釋元素,處理指令及文檔類型。當?shù)谝粋節(jié)點也就是根節(jié)點寫完后,狀態(tài)就變?yōu)镋lement。當你調(diào)用WriterStartAtribute方法時狀態(tài)轉(zhuǎn)換為Attribute,而不是當你調(diào)用WriteAtributeString方法寫屬性時轉(zhuǎn)換為該狀態(tài)。如果那樣的話,狀態(tài)應(yīng)該是Element。當你寫一個閉標簽(>)時,狀態(tài)會轉(zhuǎn)換成Content。當你寫完文檔后,調(diào)用WriteEndDocument方法,狀態(tài)就會返回為Start,直到你開始寫另一個文檔或者把Writer關(guān)掉。