程式開發筆記簿 program.maomo.info
建立 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的內容都沒有變更

發表回應

大名:
E-Mail:
網址:
回應內容:
驗證碼:
回首頁 連絡阿毛 & 交流建議
© 2007-2010, 程式開發筆記簿 program.maomo.info
程式設計 & 網站建置: Vicky Chien 寄信給阿毛