在.NET裡更好的建立XML文檔

來源:互聯網
上載者:User
xml|建立 在.NET裡更好的建立XML文檔

作者: BUILDER.COM

建立XML文檔不是一件特別困難的事,但是卻是很讓人乏味的,尤其是在你必須總是建立類型相似的文檔的時候。使用代碼來處理這些重複性的任務是行得通的。但是利用機器自動編程來建立XML文檔到底有多難或者有多容易?這取決於你所使用的方法。

編寫標示語言是令人乏味的任務
  
對於這個問題過於簡單化的回答是:建立XML文檔和建立文字文件是一樣簡單的。畢竟,XML文檔只是一個文字文件。但是一個更加現實的回答是:編寫標示語言可能會是令人頭疼的,因為你不得不顧及引號的丟失、標籤和注意大小寫敏感。換句話說,你不得不去承擔編寫標記語言的負擔。

而且,XML文檔從本質上說是分等級的,這意味著你要逐層深入地來編寫——進行基於堆棧的操作。在編寫的時候,你要開啟標籤,編輯屬性,增加子層,但是需要不斷跟蹤所開啟的最裡層元素。根據XML的句法,你必須為遵照不重疊規則而首先關掉最裡層元素。

以DOM的方式編寫XML
XML文件物件模型(XML DOM)允許你用合成法建立XML文檔。你使用一組製造方法(CreateElement、CreateComment、CreateProcessingInstruction以及其他)來建立節點對象的執行個體,然後把它們相關聯起來,構成一個樹形結構。但是,這些方法是在記憶體裡建立文檔的。那麼你如何保持一個新文檔呢?

直到W3C XML DOM第二層為止,官方的API還沒有提供對I/O的支援。一對Load和Save方法將會成為官方標準XML DOM第三層所推薦的方法的一部分,當前第三層的制定正在其最後階段。缺乏對I/O的支援倒不一定代表著它用於真實世界裡的應用程式時會有問題,但是要記住:你現在對類似XML DOM的結構所使用的任何Save方法都是對W3C DOM專有的擴充。微軟的XML核心服務庫(MSXML)從第一版開始就對文檔的持久性提供了支援。

XML DOM關鍵性的優勢是提供了一個抽象層,使你這個可憐程式員能夠免於對付結構嚴謹的XML的各種限制。其主旨是由你定義結構,而由架構來負責內容到XML文檔翻譯的細節。XML DOM方法的不足之處是其記憶體佔用的問題,它會隨著文檔內容的增加而變大。在儲存到儲存介質上以前,文檔是完全保留在記憶體裡的。正如你可以猜到的,如果你正在處理大型文檔,從效能的角度來看,這不是一個最佳的方法。


.NET的流模型
微軟的.NET Framework提供了一個更加多產的、有效,甚至更加典雅的方法來讓程式自動編寫XML代碼。在XML編寫器組件的基礎上,這種方法代表著我在前一篇文章裡所討論的基於流的剖析模型方法所對應的編寫方法。

XML編寫器代表著一個組件,它提供了把XML資料輸出到流或檔案快速和只能向前的方法。更重要的是,XML編寫器保證了——從設計上——它所產生的XML資料都遵從於W3C XML 1.0和命名空間所推薦的規則。

XML編寫器和XML DOM對象是不同的,因為前者所緩衝的資訊要少得多。XML編寫器並不在記憶體裡表示正在編輯的或者已建立的文檔。XML編寫器只是一個簡單的編寫工具,它只在內部彙集各種已建立的元素所產生的XML文本。與XML DOM不同,編寫器內部緩衝裡的資料能在任何時候被送到物理流裡——本地磁碟檔案、遠端URL或者流對象。

從某種程度上說,你可以把XML編寫器組件看作是一個建立在資料流頂部的抽象API。XML並沒有方法來編寫字串或者一組位元組,它提供的方法是用來編寫XML元素和屬性的。讓我們來看個執行個體。

XML目錄列表
假設你必須編寫一個要把目錄列表灌入XML的類,在Listing A裡的代碼顯示了這一過程應該如何進行。這段代碼建立了一個新的XmlTextWriter,並開始添加元素。使用DirectoryInfo類及其GetDirectories方法能夠取回目錄資訊。

XmlTextWriter類是你用來在磁碟檔案裡建立一個XML文檔的工具。傳遞給類構造器的空變元顯示的是用於文檔的預設編碼結構描述(UTF-8)。Formatting屬性設定的是文檔每行自動縮排的大小。

WriteStartDocument和WriteEndDocument是給文檔的編寫加括弧的。前一個方法將XML版本和編碼資訊插入到標準XML初構裡。後一個方法關閉掉所有的擱置元素,並把編寫器對象的內部狀態複位。在這兩個調用之間,你可以使用其他的WriteXXX方法來建立專門的XML元素,例如節點、屬性和註解。

元素節點是通過連續調用WriteStartElement和WriteEndElement來封裝的。WriteStartElement對應於開啟標籤;WriteEndElement對應於關閉標籤。當前開啟元素(堆棧的頂部)的屬性是用WriteAttributeString方法來設定的。最後,WriteString把純文字插入到元素節點的主體裡。

預設地,文檔只有在WriteEndDocument方法被調用的時候才被送到底層的流裡。但是,如果你要編寫一個大型文檔,Flush方法能讓你最佳化記憶體的佔用。Flush能在文檔建立過程中的任何時候被調用,它會清空內部緩衝,更新底層的流。底層的流在XML編寫器完成編寫以前都是鎖定的。

XML編寫器是一個很有用的協助工具,但是它並不是完美的。它不把內容同結構描述或者DTD文檔進行比較查驗,也不更正你所忽略的錯誤資訊。例如,如果你把同樣的屬性添加了兩次,它不會提示其錯誤。

超越標示
閱讀器和編寫器是.NET Framework裡進行每項XML I/O操作的基礎。使用XML閱讀器,你可以以一種更划算的方法剖析文檔。使用XML編寫器,你能超越標示到達一個面向節點的層面,其間不僅僅是位元組在連續記憶體塊裡的堆砌,你還能夠結合節點和實體來建立理想的結構描述和資訊集。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。