You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TextBox输入无法更新XML文件问题求助

问题:TextBox输入内容无法更新XML文件

尝试通过WebForm的TextBox输入内容更新XML文件的title节点,点击保存按钮后无报错信息,但XML文件内容始终保持初始值,未实现预期更新效果。

后台代码

<script runat="server">
    protected void btnSave_Click(object sender, EventArgs e)
    {
        string xmlPath = MapPath("xml/feed.xml");
        XmlDocument doc = new XmlDocument();

        //Check if the file already exists or not
        if (System.IO.File.Exists(xmlPath))
        {
            string Path2xml = MapPath("xml/feed.xml");
            XDocument xdoc = XDocument.Load(Path2xml);

            string txt2Title = txtTitle.Text;
            //xdoc.Element("CGTemplateDATA").Element("title").SetValue(txt2Title);
            // or even better option
            xdoc.Descendants("title").FirstOrDefault().SetValue(txt2Title);

            xdoc.Save(Path2xml);

            lblResult.Text = "XML dokumentet er blevet opdateret";
        }
        else
        {
            XmlNode declarationNode = doc.CreateXmlDeclaration("1.0", "utf-8", "yes");
            doc.AppendChild(declarationNode);
            XmlNode bookNode = CreateBookNode(doc);
            //Append the cgtemplatedata node to the document
            doc.AppendChild(bookNode);
            lblResult.Text = "XML dokumentet er hermed oprettet";
            doc.Save(xmlPath);
        }
    }

    XmlNode CreateBookNode(XmlDocument doc)
    {
        XmlNode bookNode = doc.CreateElement("CGTemplateDATA");
        //Add all the children of the book node
        XmlNode titleNode = doc.CreateElement("title");
        titleNode.InnerText = txtTitle.Text;
        bookNode.AppendChild(titleNode);

        XmlNode textNode = doc.CreateElement("text");
        textNode.InnerText = txtText.Text;
        bookNode.AppendChild(textNode);

        XmlNode referenceNode = doc.CreateElement("reference");
        referenceNode.InnerText = txtReference.Text;
        bookNode.AppendChild(referenceNode);

        return bookNode;
    }
</script>

当前XML文件内容

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<CGTemplateDATA>
  <title>Title</title>
  <text>put text here</text>
  <reference>put ref here</reference>
</CGTemplateDATA>

WebForm页面代码

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Storke-TV tekst</title>
    <link href="css/stylesheet.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <img alt="" class="style5" src="images/storke_tekst_top.png" /><br />
    <br />
        <table>
            <tr>
                <td colspan="2" style="width: 586px">
                    <b>FORSIGTIG! Denne side giver direkte adgang til at opdatere storke tekst.</b><br />
                    <br />
                    1: Udfyld felterne.<br />
                    2: Tryk på GEM TEKST.<br />
                    3: Hvis du vil opdatere teksten, så ret den, og tryk på GEM TEKST igen.<br />
                </td>
            </tr>
            <tr>
                <td colspan="2" style="width: 586px">&nbsp;</td>
            </tr>
            <tr>
                <td style="width: 85px; height: 40px">
                    Overskrift:
                </td>
                <td style="width: 501px; height: 40px">
                    <asp:TextBox ID="txtTitle" runat="server" Width="182px" Height="28px" Text="string"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td style="width: 85px; height: 41px">
                    Tekst:
                </td>
                <td style="width: 501px; height: 152px">
                    <asp:TextBox ID="txtText" Textmode="Multiline" runat="server" Width="240px" height="150"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td style="width: 85px; height: 41px">
                    Henvisning:
                </td>
                <td style="width: 501px; height: 54px">
                    <asp:TextBox ID="txtReference" Textmode="Multiline" runat="server" Width="240px" Height="42px"></asp:TextBox>
                    &nbsp;&<nbsp;<asp:Button Text="Indsæt web henvisning" runat="server" ID="btnReftxt" Width="142px" Height="24" font-size="12px" OnClick="Save"/>
                </td>
            </tr>
            <tr>
                <td style="width: 85px; height: 41px">
                    &nbsp;
                </td>
                <td style="width: 586px; height: 52px">
                    <asp:Button Text="GEM TEKST" runat="server" ID="btnSave" Width="240px" Height="40" OnClick="btnSave_Click"/>
                </td>
            </tr>
            <tr>
                <td style="width: 85px; height: 41px">
                    &nbsp;
                </td>
                <td style="width: 586px; height: 41px">
                    <asp:Label Text="Gem tekst" runat="server" ID="lblResult" Width="295px"/>
                </td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

解决方案及排查方向

1. 确认TextBox值是否正确回传

检查Page_Load事件中是否存在覆盖TextBox值的代码,比如未判断IsPostBack就重新设置初始值。如果有,修改为:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        // 仅首次加载时设置初始值
        txtTitle.Text = "string";
    }
}

2. 验证XML文件路径与权限

  • 输出xmlPath的具体路径,确认指向预期文件(可通过Response.Write(xmlPath)临时输出)。
  • 确保应用程序池身份对xml文件夹有写入权限,否则文件保存操作会静默失败。

3. 优化XDocument操作逻辑

当前代码未判断FirstOrDefault()是否找到节点,可能因节点路径或命名空间问题导致操作无效。修改代码添加判断:

protected void btnSave_Click(object sender, EventArgs e)
{
    string xmlPath = MapPath("xml/feed.xml");

    if (System.IO.File.Exists(xmlPath))
    {
        XDocument xdoc = XDocument.Load(xmlPath);
        string newTitle = txtTitle.Text.Trim();
        var titleElement = xdoc.Descendants("title").FirstOrDefault();
        
        if (titleElement != null)
        {
            titleElement.SetValue(newTitle);
            xdoc.Save(xmlPath);
            lblResult.Text = "XML dokumentet er blevet opdateret";
        }
        else
        {
            lblResult.Text = "Kunne ikke finde title node";
        }
    }
    else
    {
        // 统一使用XDocument创建新文件,避免混合XmlDocument和XDocument
        XDocument xdoc = new XDocument(
            new XDeclaration("1.0", "utf-8", "yes"),
            new XElement("CGTemplateDATA",
                new XElement("title", txtTitle.Text.Trim()),
                new XElement("text", txtText.Text.Trim()),
                new XElement("reference", txtReference.Text.Trim())
            )
        );
        xdoc.Save(xmlPath);
        lblResult.Text = "XML dokumentet er hermed oprettet";
    }
}

4. 检查页面其他控件干扰

页面中btnReftxt按钮的OnClick事件绑定为Save,但未看到对应方法实现,若该方法存在异常可能影响页面回传逻辑,建议补充实现或暂时注释该按钮的事件绑定进行测试。

内容的提问来源于stack exchange,提问作者Tue Sandbæk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:44:59