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"> </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;<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"> </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"> </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
相关产品推荐
相关产品推荐

