Figure 7 States for XML Writer
State
Description
Attribute
The writer enters this state when an attribute is being written
Closed
The Close method has been called and the writer is no longer available for writing Operations
Content
The writer enters this state when the content of a node is being written
Element
The writer enters this state when an element start tag is being written
Prolog
The writer is writing the prolog of a well-formed XML 1.0 document
Start
The writer is in an initial state, awaiting for a write call to be issued
Writer 把輸出文本存在內部的一個緩沖區內。一般情況下,緩沖區會被刷新或者被清除,當Writer被關閉前XML文本應該要寫出。在任何時你都可以通過調用Flush方法清空緩沖區,把當前的內容寫到流中(通過BaseStream屬性暴露流),然後釋放部分占用的內存,Writer仍保持為打開狀態(open state),可以繼續操作。注意,雖然寫了部分的文檔內容,但是在Writer沒有關閉前其它的程序是不能處理該文檔的。
可以用兩種方法來寫屬性節點。第一種方法是用WriteStartAtribute方法去創建一個新的屬性節點,更新Writer的狀態。接著用WriteString方法設置屬性值。寫完後,用WriteEndElement方法結束該節點。另外,你也可以用WriteAttributeString方法去創建新的屬性節點,當writerr的狀態為Element時,WriterAttributeString開始工作,它單獨創建一個屬性。同樣的,WriteStartElement方法寫節點的開始標簽(<),然後你可以隨意的設置節點的屬性和文本內容。元素節點的閉標簽都帶”/ >”。如果想寫閉標簽可以用WriteFullEndElement方法來寫。
應該避免傳送給寫方法的文本中包含敏感的標記字符,例如小於號(<)。用WriteRaw方法寫入流的字符串不會被解析,我們可以用它來對XML文檔寫入特殊的字符串。下面的兩行代碼,第一行輸出的是”<”,第二行輸出”<”:
writer.WriteString("<");
writer.WriteRaw("<");
讀寫流 有趣的是,reader(閱讀器)和writer類提供了基於Base64 和BinHex編碼的讀寫數據流的方法。WriteBase64 和 WriteBinHex方法的功能與其它的寫方法的功能存在著細微的差別。它們都是基於流的,這兩個方法的功能像一個byte數組而不是一個string。下面的代碼首先把一個string轉換成一個byte數組,然後把它們寫成一個Base64 編碼流。Encoding類的GetBytes靜態方法完成轉換的任務:
writer.WriteBase64(
Encoding.Unicode.GetBytes(buf),
0, buf.Length*2);