建立 XML 文件 - 使用XmlWriter
XmlWriter 提供順向(forward-only)、唯寫且無快取的方式來產生資料流。XmlWriter 可以:
- 驗證字元是否為合法 XML 字元,以及項目與屬性名稱是否為有效的 XML 名稱。
- 驗證 XML 文件的格式是否正確。
- 將二進位位元組編碼為 Base64 或 BinHex,並寫出產生的文字。
- 不使用字串,而使用 Common Language Runtime 型別來傳遞值。如此即不需以手動方式執行值的轉換。
- 將多個文件寫至一個輸出資料流。
- 寫入有效的名稱、限定名稱 (Quaified Name) 以及名稱語彙基元 (Token)。
XmlWriter 需使用
XMLWriter.Create() 建立實體,同時提供
XmlWriterSettings 物件的屬性來啟用或關閉 XmlWriter 所支援的功能。
使用
XmlWriter .Create() 搭配
XmlWriterSettings 物件有許多優點:
- 指定 XmlWriter 要啟用或關閉所支援的特定功能。
- 建立一個 XmlWriterSettings 物件,可提供多個複本給多個 XmlWriter 物件使用;而修改其中一個XMLWriterSettings 物件的設定,並不會影響其他使用相同設定的 XmlWriter 物件。
- XmlWriter .Create() 建立實體後,可另外接受其他的 XmlWriter 物件,而該 XmlWriter 物件不必是呼叫XmlWriter .Create() 所使用的那個 XmlWriter 物件。
以下為 XmlWriter 常用的屬性及方法
| 屬性或方法 |
說明 |
| Settings |
取得 XmlWriterSettings 物件,用於建立這個 XmlWriter 執行個體 |
| WriteState |
取得寫入器的狀態 |
| Close |
關閉 XmlWriter 資料流 |
| Create |
建立 XmlWriter 執行個體 |
| WriteAttributes |
寫入一個到多個屬性 |
| WriteAttributeString |
寫入一個具有前置詞、區域名稱、命名空間 URI 和值的屬性 |
| WriteCData |
寫入包含指定文字的 <![CDATA[...]]> 區塊 |
| WriteComment |
寫入包含指定文字的註解 <!--...--> |
| WriteDocType |
寫入具有指定名稱與選擇性屬性的 DOCTYPE 宣告 |
| WriteElementString |
寫入完整的 Element 字串,包含起始和結束標籤 |
| WriteEndAttribute |
寫入上一個呼叫 WriteStartAttribute 產生之屬性的結束標籤 |
| WriteEndDocument |
為所有沒有結束標籤的屬性和 Element 加入結束標籤,並將寫入器回復成初始狀態 |
| WriteEndElement |
寫入 Element 的結束標籤。若 Element 沒有包含內容,寫入「/>」,如 <URL />;否則寫入完整標籤 </URL> |
| WriteFullEndElement |
寫入完整的 Element 的結束標籤,如 </URL> |
| WriteNode |
將來源物件中的每個項目複製到目前的寫入器執行個體 |
| WriteProcessingInstruction |
寫入名稱與文字之間有空白的處理指令,如 <?name text?> |
| WriteRaw |
手動寫入未經處理的標記,而 XmlWriter 不會驗證傳遞至 WriteRaw 方法的資料 |
| WriteStartAttribute |
寫入屬性的起始標籤 |
| WriteStartDocument |
使用版本「1.0」寫入 XML 文件開始的 Element,即文件宣告 |
| WriteStartElement |
寫入 Element 的起始標籤 |
| WriteString |
寫入指定的文字內容 |
| WriteValue |
寫入單一簡單型別的值 |
| WriteWhitespace |
寫入空白字元 |
建立 XML 文件需呼叫 XmlWriter 的 WriteStartDocument 方法writer.WriteStartDocument()
輸出結果為<?xml version="1.0" encoding="utf-8"?>
建立文件後,接著要產生 Element
// 呼叫 WriteStartElement 方法,寫入起始標籤
writer.WriteStartElement("url");
// 寫入文字資訊
writer.WriteString("http://program.maomo.info");
// 呼叫 WriteEndElement 方法,寫入結束標籤
writer.WriteEndElement();
// --------------------------
// 亦可使用 WriteElementString 方法,輸出結果相同
writer.WriteElementString("url", "http://program.maomo.info");
輸出結果為<url>http://program.maomo.info</url>
為 Element 加入屬性
// 寫入 Element 起始標籤
writer.WriteStartElement("url");
// ==↓ 加入屬性
// 寫入屬性起始標籤
writer.WriteStartAttribute("title");
// 加入文字
writer.WriteString("程式開發資料庫");
// 寫入屬性結束標籤
writer.WriteEndAttribute();
// == ↑ 加入屬性
// 寫入 Element 結束標籤
writer.WriteEndElement();
// --------------------------
// 另一種寫法,使用 WriteAttributeString
writer.WriteStartElement("url");
writer.WriteAttributeString("title", "程式開發資料庫");
writer.WriteEndElement();
輸出結果<url title="程式開發資料庫" />
當呼叫 XmlWriter 的 Create 方法時,可傳入
XmlWriterSettings 物件進一步指定 XmlWriter 支援的功能
XmlWriterSettings 物件常用屬性如下
| 屬性 |
預設值 |
說明 |
| CheckCharacters |
True |
是否執行字元檢查。檢查文字節點中的字元和 XML 名稱使否包含不合法的字元 |
| CloseOutput |
True |
當呼叫 Close() 時,是否關閉輸出的資料流或 TextWriter 物件 |
| ConformanceLevel |
ConformanceLevel.
Document |
輸出 XML 時 XmlWriter 遵循的一致性層級
Auto: XmlReader 或 XmlWriter 物件會自動偵測是否應當執行文件或片段檢查,並進行適當的檢查。
Document: XML 資料遵循語式正確之 XML 1.0 文件的規則。
設定此選項會進行 XML 片段檢查,然後再檢查:
1. XML 文件最上方不可以是 XML 宣告、DTD、Element、註解、空白、處理指令(PI)之外的其他節點
2. XML 資料中,最上方僅能存在一個根節點 (Root Element)
Fragment: 檢查 XML 資料是語式正確的 XML 片段,XML 文件中不一定要有 Root Element,但語法要正確 |
| Encoding |
Encoding.UTF8 |
取得或設定要使用的文字編碼方式 |
| Indent |
False |
是否 Element 要縮排 |
| IndentChars |
2個空白 |
縮排時使用的字元字串。當 Indent 屬性設為 true 時會使用這項設定 |
| NewLineChars |
\r\n
(歸位字元、新行) |
取得或設定用於分行符號的字元字串 |
| NewLineHandling |
NewHandling.
Replace |
是否要將輸出中的分行符號正規化
Entitize: 使用字元實體取代新行字元
Replace: 使用 \r\n 取代新行字元
None: 將輸入保留不變 |
| NewLineOnAttributes |
False |
輸出屬性後是否換行 |
| OmitXmlDeclaration |
False |
是否寫入 XML 宣告 |
簡單的完整範例如下:[VB.NET]
' 設定 XmlWriterSettings 物件
Dim setting As New XmlWriterSettings()
setting.Encoding = System.Text.Encoding.UTF8
setting.CloseOutput = True
' 建立 XmlWriter 物件
Dim writer As XmlWriter = XmlWriter.Create(Server.MapPath("xml/test.xml"), setting)
' 宣告 XML 文件
writer.WriteStartDocument()
' 加入 Element
writer.WriteStartElement("Root")
' --------------
' 加入 Attribute
writer.WriteStartAttribute("ID")
writer.WriteString("0")
writer.WriteEndAttribute()
writer.WriteAttributeString("Name", "程式開發資料庫")
writer.WriteAttributeString("URL", "default.aspx")
' --------------
' **************
' 加入下一層第一個 Element
writer.WriteStartElement("FirstElement")
writer.WriteAttributeString("ID", "1")
writer.WriteAttributeString("Name", ".NET 開發手札")
writer.WriteAttributeString("URL", "article.aspx")
writer.WriteEndElement()
' **************
' **************
' 加入下一層第二個 Element
writer.WriteStartElement("SecondElement")
writer.WriteAttributeString("ID", "2")
writer.WriteAttributeString("Name", "Javascript")
writer.WriteAttributeString("URL", "js.aspx")
writer.WriteEndElement()
' **************
' 結束 Element
writer.WriteEndElement()
' 結束文件
writer.Close()
[C#]
// 設定 XmlWriterSettings 物件
XmlWriterSettings setting = new XmlWriterSettings();
setting.Encoding = System.Text.Encoding.UTF8;
setting.CloseOutput = true;
// 建立 XmlWriter 物件
XmlWriter writer = XmlWriter.Create(Server.MapPath("xml/test.xml"), setting);
// 宣告 XML 文件
writer.WriteStartDocument();
// 加入 Element
writer.WriteStartElement("Root");
// --------------
// 加入 Attribute
writer.WriteStartAttribute("ID");
writer.WriteString("0");
writer.WriteEndAttribute();
writer.WriteAttributeString("Name", "程式開發資料庫");
writer.WriteAttributeString("URL", "default.aspx");
// --------------
// **************
// 加入下一層第一個 Element
writer.WriteStartElement("FirstElement");
writer.WriteAttributeString("ID", "1");
writer.WriteAttributeString("Name", ".NET 開發手札");
writer.WriteAttributeString("URL", "article.aspx");
writer.WriteEndElement();
// **************
// **************
// 加入下一層第二個 Element
writer.WriteStartElement("SecondElement");
writer.WriteAttributeString("ID", "2");
writer.WriteAttributeString("Name", "Javascript");
writer.WriteAttributeString("URL", "js.aspx");
writer.WriteEndElement();
// **************
// 結束 Element
writer.WriteEndElement();
// 結束文件
writer.Close();
執行結果:
Edit:
2010/07/28 16:53:41 View:
1,084
1.
元欽
[
2010/08/06 14:22:09]
XmlWriter writer = XmlWriter.Create(Server.MapPath("test.xml"), setting);
以上編輯時出現錯誤 ,
改成XmlWriter writer = XmlWriter.Create("test.xml", setting);
沒有錯誤,且程式可以執行完成 , 但test.xml的內容都沒有變更