示範了如何利用XmlWriter類的方法從ASP.NET頁面寫入一個簡單的XML檔案。執行這個操作的ASP.NET頁面。
使用XmlWriter類寫入一個簡單的XML檔案
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
string xmlFilePath = @"C:/Data/Employees.xml";
try
{
using (XmlWriter writer = XmlWriter.Create(xmlFilePath))
{
//Start writing the XML document
writer.WriteStartDocument(false);
writer.WriteComment("This XML file represents the details of " +
"an employee");
//Start with the root element
writer.WriteStartElement("employees");
writer.WriteStartElement("employee");
writer.WriteAttributeString("id", "1");
writer.WriteStartElement("name");
writer.WriteElementString("firstName", "Nancy");
writer.WriteElementString("lastName", "lastName");
writer.WriteEndElement();
writer.WriteElementString("city", "Seattle");
writer.WriteElementString("state", "WA");
writer.WriteElementString("zipCode", "98122");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
//Flush the object and write the XML data to the file
writer.Flush();
lblResult.Text = "File is written successfully";
}
}
catch (Exception ex)
{
lblResult.Text = "An Exception occurred: " + ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Writing XML File</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:label id="lblResult" runat="server" />
</div>
</form>
</body>
</html>
在浏覽器中運作這個示例,将會看到如下提示:
An Exception occurred: Access to the path "C:/Data/Employees.xml" is denied.
導緻這個異常,是因為用于ASP.NET工作過程的ASPNET賬戶沒有對C:/Data目錄寫的權限。您可以通過 從Windows資料總管浏覽C:/Data目錄并将可以寫入該目錄的權限賦給ASPNET賬戶來解決這個問題。如果您在浏覽器中浏覽這個頁面,就會看 到“File is written successfully.”消息。從Windows資料總管浏覽C:/Data目錄并查找名為Employees.xml的檔案。該檔案應如下所示。
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--This XML file represents the details of an employee-->
<employees>
<employee id="1">
<name>
<firstName>Nancy</firstName>
<lastName>lastName</lastName>
</name>
<city>Seattle</city>
<state>WA</state>
<zipCode>98122</zipCode>
</employee>
</employees>
乍一看,這個輸出看上去并不順眼。下一節将顯示如何使用XmlWriterSettings類将這個輸出格式化。現在,還是先來一步步地解釋程式清單。
在程式清單4-6中的第一步是導入應用程式所需的所有類。在Page_Load()函數中,有一個名為 xmlFilePath且儲存了XML檔案路徑的變量。随後它将聲明一個using代碼塊來建立XmlWriter對象并傳入xmlFilePath作為 參數。接下來它開始通過調用WriteStartDocument()方法來寫入XML文檔。這将會向檔案寫入XML聲明。很明 顯,WriteComment()方法用于将有意義的注釋插入XML檔案中。因為在大多數情況下這是一個很好的做法,是以如果您的XML檔案廣泛分布,那 麼就必須編寫注釋。
接下來是建立XML文檔的過程,您可以使用WriteStartElement()方法一個接一個地向文檔中添加元 素。這個方法隻需要一個參數,元素名稱,是以不能用于寫入包含有字元資料的元素。與WriteStartElement()方法相對的是 WriteEndElement()方法,它用于向XML文檔寫入相應的結束元素。請注意這裡的方法調用順序非常重要,否則您的XML輸出将不會是格式良 好的。當然,寫入無内容的元素是一件非常輕松的事情,但是這實際上并不是非常有用,這就是為什麼還需要其他方法來向XML檔案中寫入資料的原因所在。
首先,WriteElementString()方法需要兩個參數:元素的名稱和包含其中的資料。請注意,您不需要擔心以這種方式寫入的關閉元素;WriteElementString()方法将為您完成所有的工作!
writer.WriteElementString("firstName", "Nancy");
XmlWriter類還提供了友善的WriteAttributeString()方法用于寫入屬性。例如,如下代碼使用了這個方法向<employee>元素添加id屬性。
writer.WriteAttributeString("id", "1");
Flush()方法整合了很多操作而直接将記憶體中的XML資料流寫入檔案。在這之後是一個catch塊,用于捕捉錯誤并以适當的方式退出try代碼塊。
6. 格式化XmlWriter的輸出
正如您現在所體會到的,使用XmlWriter對象非常簡單。介紹性的示例為您示範了如何使用XmlWriter類寫入XML檔案而無需太多麻煩。在本節 中,您将會更加深入地了解如何通過XmlWriterSettings類的方法來格式化XML檔案的輸出。在介紹示例之前,先看看 XmlWriterSettings類的屬性和方法。表4-9列出了XmlWriterSettings對象的重要屬性。
表4-9 XmlWriterSettings類的重要屬性
屬 性
說 明
CheckCharacters
獲得或者設定用來訓示是否要執行字元檢查的值
Encoding
獲得或者設定以Encoding對象的形式使用的文本編碼
Indent
獲得或者設定用來訓示是否縮排元素的布爾值
IndentChars
獲得或者設定在縮排時使用的字元串
NewLineChars
獲得或者設定用于換行的字元串
NewLineOnAttributes
獲得或者設定用于訓示屬性是否寫入新行的布爾值
OmitXmlDeclaration
獲得或者設定用于訓示是否應該寫入XML聲明的布爾值
除了表4-9中顯示的屬性之外,XmlWriterSettings對象還包含了同樣由 XmlReaderSettings對象支援的屬性,如ConformanceLevel,并且這些屬性都具有相同的作用。程式清單4-7顯示了如何利用 XmlWriterSettings類來定制由XmlWriter對象建立的XML檔案的輸出。
程式清單4-7 通過XmlWriterSettings類格式化XML檔案的輸出
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
string xmlFilePath = @"C:/Data/Employees.xml";
try
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.ConformanceLevel = ConformanceLevel.Auto;
settings.IndentChars = "/t";
settings.OmitXmlDeclaration = false;
using (XmlWriter writer = XmlWriter.Create(xmlFilePath, settings))
{
//Start writing the XML document
writer.WriteStartDocument(false);
//Start with the root element
writer.WriteStartElement("employees");
writer.WriteStartElement("employee");
writer.WriteAttributeString("id", "1");
writer.WriteStartElement("name");
writer.WriteElementString("firstName", "Nancy");
writer.WriteElementString("lastName", "lastName");
writer.WriteEndElement();
writer.WriteElementString("city", "Seattle");
writer.WriteElementString("state", "WA");
writer.WriteElementString("zipCode", "98122");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
//Flush the object and write the XML data to the file
writer.Flush();
lblResult.Text = "File is written successfully";
}
}
catch (Exception ex)
{
lblResult.Text = "An Exception occurred: " + ex.Message;
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Writing XML File with XmlWriterSettings</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:label id="lblResult" runat="server" />
</div>
</form>
</body>
</html>
下面是由程式清單4-7生成的輸出。
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<employees>
<employee id="1">
<name>
<firstName>Nancy</firstName>
<lastName>lastName</lastName>
</name>
<city>Seattle</city>
<state>WA</state>
<zipCode>98122</zipCode>
</employee>
</employees>
現在我們來詳細檢視一下對程式清單4-6作出的修改所帶來的令人驚訝的格式。首先,建立了 XmlWriterSettings對象的一個執行個體,然後設定各種屬性,如Indent、ConformanceLevel、IndentChars和 OmitXmlDeclaration。
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.ConformanceLevel = ConformanceLevel.Auto;
settings.IndentChars = "/t";
settings.OmitXmlDeclaration = false;
然後将XmlWriterSettings對象作為一個參數傳入XmlWriter對象的Create()方法中, 并将XmlWriterSettings對象的設定應用于新建立的XmlWriter對象。以上就是利用XmlWriterSettings對象來控制由 XmlWriter對象建立的XML檔案輸出的所有操作。