今天就說一說如何在C#中編寫XML文檔,起初我覺得用編程的方式去編寫XML簡直就是自討苦吃,後來想想還是覺得挺有用的,我想Microsoft那班傢伙能編出這些類來應該不是僅僅為了向比爾i蓋茨交差吧!至於它的用處嘛……比如說做安裝程式啊!我們可以根據在安裝過程中使用者所選的選項以及一些設定來產生相應的XML文檔再根據XML文檔來初始化我們的應用程式。空洞的話不說那麼多了,下面我們來瞭解一下具體的實現細節。
要編寫XML同樣是採用流的概念,在.NET中編寫XML的細節是作為XmlWriter類來實現的,但該類是抽象類別不能夠執行個體化,為此,我們要想在程式中訪問它的方法以實現編寫XML的願望,必需使用它的衍生類別XmlTextWriter,該類提供了一系列的屬性和方法為我們編寫XML做準備,下面將詳細的介紹這個類:
建構函式:
public XmlTextWriter(TextWriter);public XmlTextWriter(Stream, Encoding);public XmlTextWriter(string, Encoding);
第一個建構函式是把現有的TextWriter執行個體傳遞過去,System.IO.TextWriter類是一個有序的字元流
第二個建構函式是把要寫入的流作為第一個參數,第二個參數是指定XML文檔的編碼方式,預設是UTF8,可取Encoding的枚舉值,流可以是FileStream,MemoryStream,NetworkStream等等
第三個建構函式是把希望寫入的檔案名稱當作一個字串(如果存在,就重寫該檔案)傳遞給第一個參數,第二個參數指定編碼方式
常用的方法:
WriterStartDocument()和WriterEndDocument()方法:
第一個方法用來編寫XML聲明部分,如:<?xml version=”1.0” encoding=”UTF-8” ?>
第二個方法用來關閉任何開啟的元素或屬性並將編寫器重新設定為 Start 狀態。
WriterStartElement()和WriteEndElement()方法:
第一個方法用來寫出指定的開始標記,該方法有以下幾個重載:
WriterStartElement(string localname)
使用傳遞的字串作為元素的本地名稱
WriterStartElement(string localname,string namespace)
第一個參數指定元素的本地名稱,第二個參數指定元素所在的命名空間
WriterStartElement(string prefix,string localname,string namespace)
第一個參數指定元素的首碼,第二個參數指定元素的本地名稱,第三個參數指定元素所在的命名空間
第二個方法用來寫出與開始元素對應的關閉元素,如果開始元素不包含任何內容,將用一個”/>”做為關閉元素
WriterStartAttribute()和WriterEndAttribute()方法:
第一個方法用於編寫一個屬性的開頭,該方法有兩個重載:
WriterStartAttribute(string localname,string namespace)
第一個參數指定屬性的本地名稱,第二個參數指定屬性所在的命名空間
WriterStartAttribute(string prefix,string localname,string namespace)
第一個參數指定屬性的首碼,第二個參數指定屬性的本地名稱,第三個參數指定屬性所在的命名空間
第二個方法用於關閉WriterStartAttribute建立的屬性
WriterElementString()方法:
該方法可以建立一個包含字串值的元素,它有以下重載:
WriterElementString(string localname,string value)
如果編寫這樣的代碼:
WriteElementString("para", "Some text")
將輸出
<para>Some text</para>
WriterElementString(string localname,string namespace,string value)
如果編寫這樣的代碼:
WriterElementString("para", "http://www.w3.org/ns", "Some text")
將輸出:
<para xmlns=”http://www.w3.org/ns”>Some text</para>
如果編寫嵌套幾級的元素可使用WriterStartElement()和WriterEndElement()方法,如果編寫直接包含內容的元素可以使用該方法
WriterAttributeString()方法:
類似與WriterElementString()方法,在使用上如果屬性的值當中不包含實體可直接使用該方法來寫出屬性,如果屬性值包含實體可使用WriterStartAttribute()和WriterEndAttribute()方法,例如要寫出這樣的XML——<para author=”Do&0241;a&L.Perez”/>,可編寫以下代碼:
WriterStartElement(“para”);WriterStartAttribute(“author”,null);WriterString(“Do”);WriterCharEntiry(“~n”);WriterString(“a”);WriterCharEntiry(“&”);WriterString(“L.Perez”);WriterEndAttribute();WriterEndElement();
該方法有以下重載:
WriterAttributeString(string localname,string value);WriterAttributeString(string localname,string namespace,string value);WriterAttributeString(string prefx, string localname,string namespace,string value);
WriterNode(XmlReader reader,bool defattr)方法:
該方法可以從XmlReader讀取器中複製節點並把它們寫入XmlWriter流中,第一個參數是XmlReader的執行個體,第二個參數接受一個布爾值,決定是否複製元素中的屬性,考慮下面XML片段:
<para><sent>The<b>XmlWriter</b>class writes XML content to a Stream.</sent></para>
以下代碼複製其中的片段,reader代表XmlReader的執行個體writer代表XmlWriter類的執行個體:
while(reader.Read()){ if (reader.Name == ”sent” && reader.NodeType == XmlNodeType.Element) { writer.WriterNode(reader,true); }}
得到以下輸出:
<sent>The<b>XmlWriter</b>class writes XML content to a Stream.</sent>
WriterComment(string text)方法:用於寫出注釋
WriterString(string text)方法:用於寫出文本
WriterCData(string text)方法:寫出CDATA資料區塊
WriterBase64(byte[] buffer,int index,int count)方法:將指定的二進位位元組編碼為 Base64 並寫出結果文本
Flush():將緩衝區中的所有內容重新整理到基礎流,並同時重新整理基礎流 Close():關閉此流和基礎流。