天天看點

寫入一個簡單的XML檔案

 示範了如何利用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檔案輸出的所有操作。