語言

XmlDataSource.Save 方法

定義

如果設定了XmlDataSource該屬性,控制器目前儲存在記憶體DataFile中的 XML 資料會儲存到磁碟。

public:
 void Save();
public void Save();
member this.Save : unit -> unit
Public Sub Save ()

例外狀況

XML 資料是用屬性Data載入,而非屬性。DataFile

-或-

屬性指定 DataFile 了一個 URL;但該 XmlDataSource 控制項並未擁有該網頁資源的正確權限。

該屬性會指定 DataFile 一個 URL;但該 URL 並非基於 HTTP 的 URL。

-或-

設計時相對路徑在使用 XmlDataSource 控制項前未被正確映射。

該物業指定的 DataFile 路徑被拒絕進入。

範例

本節包含兩個程式代碼範例。 第一個程式碼範例示範如何使用 XmlDataSource 帶有 TreeView 控制項的控制項來顯示和編輯包含在 XML 檔案中的 XML 資料。 第二個程式碼範例示範如何使用 XmlDataSource 帶有模板控制 Repeater 項的控制項來顯示和編輯包含在 XML 檔案中的 XML 資料。

以下程式碼範例示範如何使用 XmlDataSource 帶有 TreeView 控制項的控制項來顯示及編輯包含在 XML 檔案中的 XML 資料。 每次選擇GetXmlDocument節點時,資料都會用此TreeView方法在記憶體中操作,然後儲存到 XML 檔案中。 最後, DataBind 在控制項上呼叫 TreeView 以刷新顯示的資料。

<%@ Page LANGUAGE="C#" SMARTNAVIGATION="false" %>
<%@ Import Namespace="System.Xml" %>

<script runat="server" >
  void TreeView1_SelectedNodeChanged(Object sender, EventArgs e)
  {
    XmlDocument myXml = new XmlDocument();
    myXml=(XmlDocument)XmlSource.GetXmlDocument();

    String iterator = TreeView1.SelectedNode.DataPath;

    XmlNode myNode = myXml.SelectSingleNode(iterator);

    myNode.InnerText = "ThisIsATest";
    XmlSource.Save();
    TreeView1.DataBind();
    TreeView1.ExpandAll();
  }
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" runat="server">

      <asp:xmldatasource
        runat="server"
        id="XmlSource"
        xpath="/bookstore/book"
        datafile="Booksort.xml"
        enableviewstate="False"
        enablecaching="False" />

      <asp:treeview
        runat="server"
        id="TreeView1"
        ExpandDepth="3"
        datasourceid="XmlSource"
        maxdatabinddepth="3"
        autogeneratedatabindings="False"
        onselectednodechanged="TreeView1_SelectedNodeChanged" >
        <databindings>
          <asp:treenodebinding datamember="book" valuefield="publicationdate" />
          <asp:treenodebinding datamember="title" valuefield="#InnerText" />
          <asp:treenodebinding datamember="author" valuefield="#InnerText" />
          <asp:treenodebinding datamember="first-name" valuefield="#InnerText" />
          <asp:treenodebinding datamember="last-name" valuefield="#InnerText" />
        </databindings>
      </asp:treeview>
    </form>
  </body>
</html>
<%@ Page LANGUAGE="VB" SMARTNAVIGATION="false" %>
<%@ Import Namespace="System.Xml" %>

<script runat="server" >
  Private Sub TreeView1_SelectedNodeChanged(sender As Object, e As EventArgs)

    Dim myXml As New XmlDocument
    myXml = CType(XmlSource.GetXmlDocument(), XmlDataDocument)

    Dim iterator As String = TreeView1.SelectedNode.DataPath
    Dim myNode As XmlNode = myXml.SelectSingleNode(iterator)

    myNode.InnerText = "ThisIsATest"
    XmlSource.Save()
    TreeView1.DataBind()
    TreeView1.ExpandAll()
  End Sub ' TreeView1_SelectedNodeChanged
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" runat="server">

      <asp:xmldatasource
        runat="server"
        id="XmlSource"
        xpath="/bookstore/book"
        datafile="Booksort.xml"
        enableviewstate="False"
        enablecaching="False" />

      <asp:treeview
        runat="server"
        id="TreeView1"
        ExpandDepth="3"
        datasourceid="XmlSource"
        maxdatabinddepth="3"
        autogeneratedatabindings="False"
        onselectednodechanged="TreeView1_SelectedNodeChanged" >
        <databindings>
          <asp:treenodebinding datamember="book" valuefield="publicationdate" />
          <asp:treenodebinding datamember="title" valuefield="#InnerText" />
          <asp:treenodebinding datamember="author" valuefield="#InnerText" />
          <asp:treenodebinding datamember="first-name" valuefield="#InnerText" />
          <asp:treenodebinding datamember="last-name" valuefield="#InnerText" />
        </databindings>
      </asp:treeview>
    </form>
  </body>
</html>

以下程式碼範例示範如何使用 XmlDataSource 帶有模板控制 Repeater 項的控制項來顯示和編輯包含在 XML 檔案中的 XML 資料。 如前例,資料在記憶體中透過 XmlDataDocument 方法檢索 GetXmlDocument 的物件進行操作。 最後, DataBind 在控制項上呼叫 TreeView 以刷新顯示的資料。

<%@ Page LANGUAGE="C#" SMARTNAVIGATION="false" %>
<%@ Import NameSpace="System.Xml" %>
<script runat="server" >

  void Button1_Click(Object sender, EventArgs e)
  {
    XmlDocument myXml = new XmlDocument();
    myXml=(XmlDocument)XmlSource.GetXmlDocument();

    String path = "bookstore/book/@publicationdate";
    XmlNodeList nodeList;
    nodeList = myXml.SelectNodes(path);
    foreach (XmlNode date in nodeList)
      {
        int helper = int.Parse(date.Value) + 2;
        date.Value = helper.ToString();
      }
    XmlSource.Save();
    Repeater1.DataBind();
  }

</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" runat="server" >

      <asp:XmlDataSource
        runat="server"
        ID="XmlSource"
        XPath="bookstore/book[@genre='novel']"
        DataFile="Booksort2.xml"
        EnableViewState="True"
        EnableCaching="False" />

      <asp:Repeater
        runat="server"
        ID="Repeater1"
        DataSourceID="XmlSource" >
          <ItemTemplate >
            <h1><%# XPath ("title/text()") %> </h1>
              <b>Author:</b><%# XPath ("author/first-name/text()") %> <%# XPath ("author/last-name/text()") %>
              <b>PublicationDate:</b><%# XPath ("@publicationdate") %>
              <b>Price:</b><%# XPath ("price/text()") %>
          </ItemTemplate>
      </asp:Repeater>


      <p><asp:Button
        runat="server"
        ID="Button1"
        onclick="Button1_Click"
        Text="Add 2 years to the Publication Date!" /></p>
</form>
</body>
</html>
<%@ Page LANGUAGE="VB" SMARTNAVIGATION="false" %>
<%@ Import Namespace="System.Xml" %>

<script runat="server" >

  Private Sub Button1_Click(sender As Object, e As EventArgs)

    Dim myXml As New XmlDocument
    myXml = CType(XmlSource.GetXmlDocument(), XmlDocument)

    Dim path As String = "bookstore/book/@publicationdate"
    Dim nodeList As XmlNodeList = myXml.SelectNodes(path)

    Dim aDate As XmlNode
    For Each aDate In  nodeList
      Dim helper As Integer = Int32.Parse(aDate.Value) + 2
      aDate.Value = helper.ToString()
    Next aDate

    XmlSource.Save()
    Repeater1.DataBind()

  End Sub 'Button1_Click
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>ASP.NET Example</title>
</head>
<body>
    <form id="Form1" runat="server" >

      <asp:XmlDataSource
        runat="server"
        ID="XmlSource"
        XPath="bookstore/book[@genre='novel']"
        DataFile="Booksort2.xml"
        EnableViewState="True"
        EnableCaching="False" />

      <asp:Repeater
        runat="server"
        ID="Repeater1"
        DataSourceID="XmlSource" >
          <ItemTemplate >
            <h1><%# XPath ("title/text()") %> </h1>
              <b>Author:</b><%# XPath ("author/first-name/text()") %> <%# XPath ("author/last-name/text()") %>
              <b>PublicationDate:</b><%# XPath ("@publicationdate") %>
              <b>Price:</b><%# XPath ("price/text()") %>
          </ItemTemplate>
      </asp:Repeater>


      <p><asp:Button
        runat="server"
        ID="Button1"
        onclick="Button1_Click"
        Text="Add 2 years to the Publication Date!" /></p>
</form>
</body>
</html>

程式碼範例中的 XML 檔案包含以下資料:

<?xml version="1.0" encoding="utf-8"?>
 <bookstore xmlns:bk="urn:samples">
   <book genre="novel" publicationdate="1999" bk:ISBN="0000000000">
     <title>Secrets of Silicon Valley</title>
     <author>
       <first-name>Sheryl</first-name>
       <last-name>Hunter</last-name>
     </author>
     <price>24.95</price>"
     </book>
   <book genre="novel" publicationdate="1985" bk:ISBN="1111111111">
     <title>Straight Talk About Computers</title>
     <author>
       <first-name>Dean</first-name>
       <last-name>Straight</last-name>
     </author>
     <price>29.95</price>
   </book>
</bookstore>

備註

雖然這個 XmlDataSource 控制項通常用於唯讀資料綁定情境,但你也可以用它 XmlDataSource 來編輯底層 XML 資料檔中的 XML 資料。 在這些情境中,控制項會從 XML 檔案 XmlDataSource 載入 XML 資料。 你用這個XmlDataDocument方法在記憶體中修改 ,GetXmlDocument然後透過呼叫該Save方法儲存到 XML 資料檔。 當符合以下條件時,可編輯的 XML 情境是可能的:

  • XML 資料是從屬性所指示 DataFile 的 XML 檔案載入,而非從屬性中 Data 指定的內嵌 XML 資料載入。

  • 或Transform屬性中未指定 TransformFile XSLT 轉換。

此 Save 方法無法處理不同請求的同時存檔操作。 如果有多位使用者透過控制 XmlDataSource 項編輯 XML 檔案,無法保證所有使用者使用相同的資料。 Save同樣的並發問題也可能導致操作失敗。

適用於

另請參閱