標籤:des style blog http io ar os 使用 sp
轉自http://www.jb51.net/article/35230.htm .NET中包含了很多支援XML的類,這些類使得程式員使用XML編程就如同理解XML檔案一樣簡單。在這篇文章中,我將給出這樣的一個類的使用樣本,這個類就是XmlTextWriter類
XmlTextWriter類允許你將XML寫到一個檔案中去。這個類包含了很多方法和屬性,使用這些屬性和方法可以使你更容易地處理XML。為了使用這個類,你必須首先建立一個新的XmlTextWriter對象,然後你可以將XML片斷加入到這個對象中。這個類中包含了不少的方法用於將各種類型的XML元素添加到XML檔案中,下表給出了這些方法的名字和描述情況:
方法 描述
WriteStartDocument 書寫版本為“1.0”的 XML 聲明
WriteEndDocument 關閉任何開啟的元素或屬性
Close 關閉流
WriteDocType 寫出具有指定名稱和可選屬性的 DOCTYPE 聲明
WriteStartElement 寫出指定的開始標記
WriteEndElement 關閉一個元素
WriteFullEndElement 關閉一個元素,並且總是寫入完整的結束標記
WriteElementString 寫出包含字串值的元素
WriteStartAttribute 書寫屬性的起始內容
WriteEndAttribute 關閉上一個 WriteStartAttribute 調用
WriteRaw 手動書寫原始標記
WriteString 書寫一個字串
WriteAttributeString 出具有指定值的屬性
WriteCData 寫出包含指定文本的 <![CDATA[...]]> 塊
WriteComment 寫出包含指定文本的注釋 <!--...-->
WriteWhiteSpace 寫出給定的空白
WriteProcessingInstruction 寫出在名稱和文本之間帶有空格的處理指示,如下所示:<?name text?>
如果你對於XML十分熟悉,那麼你一定能很好的理解上面的這些方法。下面我們將給出一個例子,在這個例子中,我們將先建立一個文檔,添加一些元素,然後關閉這個文檔。添加了元素後你還可以添加子項目,屬性和其他內容。下面的代碼就是這樣的一個例子,它建立了一個檔案名稱為title的XML檔案。
複製代碼 代碼如下:using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextWriter writer = new XmlTextWriter("titles.xml", null); //寫入根項目 writer.WriteStartElement("items"); //加入子項目 writer.WriteElementString("title", "Unreal Tournament 2003"); writer.WriteElementString("title", "C&C: Renegade"); writer.WriteElementString("title", "Dr. Seuss‘s ABC"); //關閉根項目,並書寫結束標籤 writer.WriteEndElement(); //將XML寫入檔案並且關閉XmlTextWriter writer.Close(); } }
如果你編譯並且執行上面的代碼,你將建立這個XML檔案,檔案中包含如下內容:
複製代碼 代碼如下:<items> <title>Unreal Tournament 2003</title> <title>C&C: Renegade</title> <title>Dr. Seuss‘s ABC</title> </items>
上面的代碼建立了一個名為writer的XmlTextWriter對象。當這個對象被建立時,它被關聯到一個名為titles.xml的檔案。接著,程式建立了一個叫做items的根屬性,WriteStartElement方法建立了這個屬性的開始標籤。接下來,程式調用了WriteElementString方法建立了三個子項目。從上面的代碼你還可以看到,這個方法使用第一個參數(在上面的程式中是title)作為元素的標籤;使用第二個參數作為元素的值。當你添加了所有的元素後,你需要關閉根項目。這時你可以調用WriteEndElement方法關閉那個最近被開啟的元素;在本例中,這個最近被開啟的元素就是根項目。當所有的資料都已經寫好,根項目也已經關閉時,你可以將資訊傳送給你的XmlTextWriter。這意味著這時候你可以調用Close方法關閉它了。
上面的代碼相對十分的簡單,下面我們看一個使用了XmlTextWriter類中更多方法,功能更加完善的例子。
複製代碼 代碼如下:using System; using System.IO; using System.Xml; public class Sample { public static void Main() { XmlTextWriter writer = new XmlTextWriter("myMedia.xml", null); //使用自動縮排便於閱讀 writer.Formatting = Formatting.Indented; //書寫根項目 writer.WriteStartElement("items"); //開始一個元素 writer.WriteStartElement("item"); //向先前建立的元素中添加一個屬性 writer.WriteAttributeString("rating", "R"); //添加子項目 writer.WriteElementString("title", "The Matrix"); writer.WriteElementString("format", "DVD"); //關閉item元素 writer.WriteEndElement(); // 關閉元素 //在節點間添加一些空格 writer.WriteWhitespace("\n"); //使用原始字串書寫第二個元素 writer.WriteRaw("<item>" + "<title>BloodWake</title>" + "<format>XBox</format>" + "</item>"); //使用格式化的字串書寫第三個元素 writer.WriteRaw("\n <item>\n" + " <title>Unreal Tournament 2003</title>\n" + " <format>CD</format>\n" + " </item>\n"); // 關閉根項目 writer.WriteFullEndElement(); //將XML寫入檔案並關閉writer writer.Close(); } }
上面代碼編譯運行後將得到myMedia.xml檔案,檔案的內容為:
複製代碼 代碼如下: <items> <item rating="R"> <title>The Matrix</title> <format>DVD</format> </item> <item> <title>BloodWake</title> <format>XBox</format> </item> <item> <title>Unreal Tournament 2003</title> <format>CD</format> </item> </items>
上面代碼中的注釋說明了這個程式的功能是如何?的。需要記住的一件事是:當調用方法開始一個操作時,你需要在程式的合適的地方調用方法結束這個操作。例如,你調用了StartElement,你就必須調用EndElement關閉元素;當然在這兩個調用之間你也可以加入一個子項目。無論你何時調用EndElement方法,它總是關閉最近使用StartElement方法開啟的那個元素(這和棧的工作方式很相似)。
使用XmlTextWriter十分的容易,不過我還是建議你自己動手試試這些代碼和方法。你試過以後會發現這些代碼能夠很容易地整合到你的程式中。你還應該記住,XmlTextWriter僅僅是.NET提供的眾多XML類中的一個。和XmlTextWriter一樣,其他的XML類也十分的容易使用
2)
我用的是一種很笨的方法,但可以協助初學者瞭解訪問XML節點的過程。
已知有一個XML檔案(bookstore.xml)如下:
複製代碼 代碼如下:<?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> </bookstore>
1、往<bookstore>節點中插入一個<book>節點:
複製代碼 代碼如下: XmlDocument xmlDoc=new XmlDocument(); xmlDoc.Load("bookstore.xml"); XmlNode root=xmlDoc.SelectSingleNode("bookstore");//尋找<bookstore> XmlElement xe1=xmlDoc.CreateElement("book");//建立一個<book>節點 xe1.SetAttribute("genre","李贊紅");//設定該節點genre屬性 xe1.SetAttribute("ISBN","2-3631-4");//設定該節點ISBN屬性
XmlElement xesub1=xmlDoc.CreateElement("title"); xesub1.InnerText="CS從入門到精通";//設定文本節點 xe1.AppendChild(xesub1);//添加到<book>節點中 XmlElement xesub2=xmlDoc.CreateElement("author"); xesub2.InnerText="候捷"; xe1.AppendChild(xesub2); XmlElement xesub3=xmlDoc.CreateElement("price"); xesub3.InnerText="58.3"; xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<bookstore>節點中 xmlDoc.Save("bookstore.xml");
結果為:
複製代碼 代碼如下:<?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book genre="李贊紅" ISBN="2-3631-4"> <title>CS從入門到精通</title> <author>候捷</author> <price>58.3</price> </book> </bookstore>
2、修改節點:將genre屬性值為“李贊紅“的節點的genre值改為“update李贊紅”,將該節點的子節點<author>的文本修改為“亞勝”。
複製代碼 代碼如下: XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//擷取bookstore節點的所有子節點 foreach(XmlNode xn in nodeList)//遍曆所有子節點 { XmlElement xe=(XmlElement)xn;//將子節點類型轉換為XmlElement類型 if(xe.GetAttribute("genre")=="李贊紅")//如果genre屬性值為“李贊紅” { xe.SetAttribute("genre","update李贊紅");//則修改該屬性為“update李贊紅”
XmlNodeList nls=xe.ChildNodes;//繼續擷取xe子節點的所有子節點 foreach(XmlNode xn1 in nls)//遍曆 { XmlElement xe2=(XmlElement)xn1;//轉換類型 if(xe2.Name=="author")//如果找到 { xe2.InnerText="亞勝";//則修改 break;//找到退出來就可以了 } } break; } }
xmlDoc.Save("bookstore.xml");//儲存。
最後結果為:
複製代碼 代碼如下:<?xml version="1.0" encoding="gb2312"?> <bookstore> <book genre="fantasy" ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book genre="update李贊紅" ISBN="2-3631-4"> <title>CS從入門到精通</title> <author>亞勝</author> <price>58.3</price> </book> </bookstore>
3、刪除 <book genre="fantasy" ISBN="2-3631-4">節點的genre屬性,刪除 <book genre="update李贊紅" ISBN="2-3631-4">節點。
複製代碼 代碼如下:XmlNodeList xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach(XmlNode xn in xnl) { XmlElement xe=(XmlElement)xn; if(xe.GetAttribute("genre")=="fantasy") { xe.RemoveAttribute("genre");//刪除genre屬性 } else if(xe.GetAttribute("genre")=="update李贊紅") { xe.RemoveAll();//刪除該節點的全部內容 } } xmlDoc.Save("bookstore.xml");
最後結果為:
複製代碼 代碼如下:<?xml version="1.0" encoding="gb2312"?> <bookstore> <book ISBN="2-3631-4"> <title>Oberon‘s Legacy</title> <author>Corets, Eva</author> <price>5.95</price> </book> <book> </book> </bookstore>
4、顯示所有資料。
複製代碼 代碼如下: XmlNode xn=xmlDoc.SelectSingleNode("bookstore");
XmlNodeList xnl=xn.ChildNodes;
foreach(XmlNode xnf in xnl) { XmlElement xe=(XmlElement)xnf; Console.WriteLine(xe.GetAttribute("genre"));//顯示內容值 Console.WriteLine(xe.GetAttribute("ISBN"));
XmlNodeList xnf1=xe.ChildNodes; foreach(XmlNode xn2 in xnf1) { Console.WriteLine(xn2.InnerText);//顯示子節點點文本 } }
C#中XmlTextWriter讀寫xml檔案詳細介紹(轉)