使用POST来更改XML文件?

时间:2013-12-24 16:48:26

标签: asp.net xml xpath

所以我正在为我的办公室使用一个新工具,这基本上只是一个网页,可以为办公室的地图提供一些额外的功能。我的困惑在于为什么我试图让它可编辑。

我获得使用的服务器上有ASP.NET(2.0.50727),我想我会用它。

基本上,地图的每个部分都是可编辑的(办公室,打印机,墙壁等)。当您单击一个(假设您在管理页面上)时,它会显示一个包含所有相应字段的简单HTML表单。单击“应用”,然后将其POST到.aspx页面,该页面应该更改相关的XML文档,然后将您转发回地图。

我似乎无法弄清楚,是整个ASP.NET。经过几天的搜索/实验,我什么都没有。到目前为止,我已经能够做到这一点:

<%@ Page Language="VB" %>
<!DOCTYPE html>
<html>
<body><%
dim format
format=Request.Form("Format") 'The format of the thing being edited. determines which .xml file to use
If format<>"" Then
      Response.Write(format)
End If

dim objectID
objectID=Request.Form("objectID")
If objectID<>"" Then
      Response.Write(objectID)
End If
XmlSource.XPath = format+"s/"+format+"[@objectID='"+objectID+"']"
XmlSource.DataFile = format+"s.xml"
%>
<form id="Form1" runat="server" >

      <asp:XmlDataSource
        runat="server"
        ID="XmlSource"
        EnableViewState="True"
        EnableCaching="False" />

      <asp:Repeater
        runat="server"
        ID="Repeater1"
        DataSourceID="XmlSource" >
          <ItemTemplate >
            <h1><%# XPath ("@type") %> </h1>
          </ItemTemplate>
      </asp:Repeater>
</form>
</body>
</html>

但是,如果我设置了XPath&amp;节点,那么它会将每个节点的“type”吐出数据文件手动或吐出:“Object reference not set to an instance of an object”如果我试图使其动态化(我有多种格式,如房间,墙壁,打印机等,每个都有自己的XML文件),这就是所需要的。

我只是在寻找一些指导,因为我不知道我在做什么。有什么想法吗?

编辑:在大多数情况下计算出来。这是我的新代码:

<%@ Page LANGUAGE="VB" SMARTNAVIGATION="false" debug="true"%>
<%@ Import Namespace="System.Xml" %>

<script runat="server" >

  Private Sub Page_Load

    dim format
    format=Request.Form("format")
    If format<>"" Then
      Response.Write(format)
    End If
    XmlSource.DataFile = format+"s.xml"

    dim newObjectIDFromPOST
    newObjectIDFromPOST=Request.Form("objectID")
    If newObjectIDFromPOST<>"" Then
      Response.Write(newObjectIDFromPOST)
    End If

    dim oldObjectIDFromPOST
    oldObjectIDFromPOST=Request.Form("oldObjectID")
    If oldObjectIDFromPOST<>"" Then
      Response.Write(oldObjectIDFromPOST)
    End If

    Dim myXml As New XmlDocument

    myXml = CType(XmlSource.GetXmlDocument(), XmlDocument)
    Dim path As String = format+"s/"+format+"[@objectID='"+oldObjectIDFromPOST+"']"
    Dim node As XmlNode = myXml.SelectSingleNode(path)

    If format = "room" Then
      node.Attributes("objectID").Value = newObjectIDFromPOST
    End If

    XmlSource.Save()
    Repeater1.DataBind()

  End Sub 'on page load
</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"
        EnableViewState="True"
        EnableCaching="False" />

        <asp:Repeater
        runat="server"
        ID="Repeater1"
        DataSourceID="XmlSource" >
          <ItemTemplate >
            <h1><%# XPath ("@objectID") %> </h1>
          </ItemTemplate>
      </asp:Repeater>
</form>
</body>

1 个答案:

答案 0 :(得分:0)

常规调试:页面中以下几行的输出是什么?

Response.Write(format)

Response.Write(objectID)

添加以下几行时怎么样? (我们需要找到null的对象,并导致错误。)

XmlSource.XPath = format+"s/"+format+"[@objectID='"+objectID+"']"
Response.Write("[" + XmlSource.XPath + "]")
XmlSource.DataFile = format+"s.xml"
Response.Write("[" + XmlSource.DataFile + "]")