??設計XmlReadWriter類
??如前面所說,XML reader和Writer是各自獨立工作的:reader只讀,writer只寫。假設你的利用程式要治理冗長的XML文檔,且該文檔有不斷定的資料。 Reader供給了一個很好的方法往讀該文件的內容。另一方面,Writer是一個非常有用的用於創立XML文檔片段工具,但是假如你想要它即能讀,又能寫,那麼你就要用XMLDOM了。假如實際的XML文件非常宏大,又會呈現了一個標題,什麼標題呢?是不是把這個XML文件全部載入到記憶體中,然落後行讀寫呢?讓我們先來看看怎麼樣建立一個混雜的流分析器來分析大型的XMLDOM。
??像一般的只讀把持一樣,用普通的XML reader往次序的拜訪節點。不同的是,在讀的同時你可以用XML writer轉變屬性值以及節點的內容。你用reader往讀原始檔中的每個節點,後台的writer創立該節點的一個拷貝。在這個拷貝中,你可以增加一些新的節點,疏忽或編纂其它的一些節點,還可以編纂屬性的值。當你完成修正後,你就用新的文檔調換舊的文檔。
??一個簡單有效的措施是從唯讀流中拷貝節點物件到write流中,這種方法可以用XmlTextWriter類別中的兩個方法:WriteAttributes方法和WriteNode方法。 WriteAttributes方法讀取目前reader中選取的節點的所有有效的屬性,然後把屬性當作一個單獨的string拷貝到目前的輸出流中。同樣的,WriteNode方法用類似的方法處理除屬性節點外的其它類型的節點。圖十所示的程式碼片段示範了怎麼用上述的兩個方法創立一個來源XML文檔的拷貝,有選擇的修正某些節點。 XML樹從樹根開端被拜訪,但只輸出了除屬性節點類型以外的其它類型的節點。你可以把Reader和Writer整合在一個新的類別中,設計一個新的接口,使它能讀寫流及拜訪屬性和節點。
Figure 10 Using the WriteNode Method
XmlTextReader reader = new XmlTextReader(inputFile);
XmlTextWriter writer = new XmlTextWriter(
writer.Formatting = Formatting.Indented;
reader.MoveToContent();
// Write根節點
writer.WriteStartElement(reader.LocalName);
=)
while (reader.Read())
{
if (i % 2)
writer.WriteNode(reader, false);
i ; ter.WriteEndElement ();
// Close reader and writer
writer.Close();
reader.Close();
??我的XadercBterRadercBter5或從類別中並沒有持續。取而代之的是另外兩個類,一個是基於只讀流(stream)的把持類,另一個是基於只寫流的把持類。 XmlTextReadWriter類別的方法用Reader物件讀取數據,寫入到Writer物件。為了適應不同的需求,內部的Reader和Writer 物件分辨透過唯讀的Reader和Writer屬性公然。圖十一列出了該類別的一些方法:
Figure 11 XmlTextReadWriter Class Methods
Method
Description
AddAttributeChange
Description
AddAttributeChange this al method are processed during a successive call to WriteAttributes.
Read
Simple wrapper around the internal reader's Read method.
WriteAttributes 級 atwrversion doversion" given node, taking into account all the changes cached through the AddAttributeChange method.
WriteEndDocument
Terminates the current document in the writer and closes both the reader and the writer.
Write電話text and the standard XML prolog.
??這個新類別有一個Read方法,它是對Reader的read方法的一個簡略的封裝。另外,它供給了WriterStartDocument和WriteEndDocument方法。它們分辨初始化/開釋(finalize)了內部Reader和writer對象,也處理所有I/O把持。在循環讀節點的同時,我們就可以直接的修正節點。基於效能的原因,要修正屬性必需先用AddAttributeChange方法宣告。對一個節點的屬性所做的所有修正都會存放在一個暫時的表中,最後,透過呼叫WriteAttribute方法提交修正,清除臨時表。
以上就是在.NET Framework中輕鬆處理XML資料(5-1) 的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!