ASP.NET Web Forms – XML 文件

ASP.NET Web Forms 中操作 XML 文件的完整实战指南(适用于老项目和新项目)

在 ASP.NET Web Forms 项目中,XML 文件常用于配置、数据交换、小型数据存储(如省市区联动、菜单、权限表等)。下面系统性地介绍所有常见操作方式。

1. XML 文件常用存放位置(推荐)

位置用途示例路径
App_Data读写都安全,不会直接被浏览器访问~/App_Data/products.xml
网站根目录只读配置~/Config/settings.xml
自定义文件夹加 web.config 权限限制~/XmlData/city.xml

2. 最常用的 4 种操作方式对比

方式优点缺点推荐场景
XmlDocument功能最全,支持 XPath、增删改查性能较差,全载入内存小文件、复杂操作
XDocument (LINQ to XML)代码最简洁,现代写法需要 .NET 3.5+新项目、代码可读性优先
XmlTextReader/Writer流式读写,内存占用极小代码较繁琐大文件(>10MB)
DataSet.ReadXml/WriteXml一行代码绑定 GridView灵活性差快速原型、后台管理

3. 完整实战示例(都放在一个 .aspx 页面里演示)

<!-- XmlDemo.aspx -->
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="XmlDemo.aspx.cs" Inherits="WebFormsDemo.XmlDemo" %>

<!DOCTYPE html>
<html>
<head runat="server">
    <title>XML 操作演示</title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:Button ID="btnCreate" runat="server" Text="1. 创建 XML" OnClick="btnCreate_Click" />
        <asp:Button ID="btnRead" runat="server" Text="2. 读取并绑定 GridView" OnClick="btnRead_Click" />
        <asp:Button ID="btnAdd" runat="server" Text="3. 添加节点" OnClick="btnAdd_Click" />
        <asp:Button ID="btnDelete" runat="server" Text="4. 删除节点" OnClick="btnDelete_Click" />
        <br /><br />
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="Id" HeaderText="编号" />
                <asp:BoundField DataField="Name" HeaderText="姓名" />
                <asp:BoundField DataField="Age" HeaderText="年龄" />
                <asp:BoundField DataField="City" HeaderText="城市" />
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>
// XmlDemo.aspx.cs
using System;
using System.Data;
using System.Web.UI;
using System.Xml;
using System.Xml.Linq;
using System.IO;

public partial class XmlDemo : Page
{
    // XML 文件物理路径(推荐放在 App_Data)
    private string XmlPath => Server.MapPath("~/App_Data/students.xml");

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (!File.Exists(XmlPath))
                btnCreate_Click(null, null);  // 自动创建示例文件
        }
    }

    // 1. 创建 XML 文件(XmlDocument 方式)
    protected void btnCreate_Click(object sender, EventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
        doc.AppendChild(dec);

        XmlElement root = doc.CreateElement("Students");
        doc.AppendChild(root);

        AddStudent(doc, root, "1", "张三", "23", "北京");
        AddStudent(doc, root, "2", "李四", "25", "上海");
        AddStudent(doc, root, "3", "王五", "22", "广州");

        // 确保 App_Data 目录存在
        Directory.CreateDirectory(Path.GetDirectoryName(XmlPath));
        doc.Save(XmlPath);

        Response.Write("<script>alert('XML 文件创建成功!');</script>");
    }

    private void AddStudent(XmlDocument doc, XmlNode root, string id, string name, string age, string city)
    {
        XmlElement stu = doc.CreateElement("Student");
        stu.SetAttribute("Id", id);

        XmlElement n = doc.CreateElement("Name"); n.InnerText = name;
        XmlElement a = doc.CreateElement("Age");  a.InnerText = age;
        XmlElement c = doc.CreateElement("City"); c.InnerText = city;

        stu.AppendChild(n);
        stu.AppendChild(a);
        stu.AppendChild(c);
        root.AppendChild(stu);
    }

    // 2. 读取 XML 并绑定 GridView(最快的方式:DataSet)
    protected void btnRead_Click(object sender, EventArgs e)
    {
        DataSet ds = new DataSet();
        ds.ReadXml(XmlPath);   // 一行代码搞定!

        GridView1.DataSource = ds.Tables[0];
        GridView1.DataBind();
    }

    // 3. 添加新学生(XDocument 现代写法,推荐)
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        XDocument doc = XDocument.Load(XmlPath);

        int maxId = doc.Root.Elements("Student")
                        .Max(x => (int)x.Attribute("Id"));

        doc.Root.Add(
            new XElement("Student",
                new XAttribute("Id", maxId + 1),
                new XElement("Name", "赵新" + (maxId + 1)),
                new XElement("Age", "24"),
                new XElement("City", "深圳")
            )
        );

        doc.Save(XmlPath);
        btnRead_Click(null, null);  // 刷新显示
    }

    // 4. 删除 Id=2 的学生(XmlDocument + XPath)
    protected void btnDelete_Click(object sender, EventArgs e)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(XmlPath);

        XmlNode node = doc.SelectSingleNode("/Students/Student[@Id='2']");
        if (node != null)
        {
            node.ParentNode.RemoveChild(node);
            doc.Save(XmlPath);
        }

        btnRead_Click(null, null);
    }
}

4. 其他高频实用技巧

// 读取配置节点(常用于自定义配置文件)
string GetConfigValue(string key)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(Server.MapPath("~/Config/appSettings.xml"));
    XmlNode node = doc.SelectSingleNode($"//add[@key='{key}']");
    return node?.Attributes["value"]?.Value;
}

// 大文件流式读取(>10MB 时推荐)
void ReadLargeXml()
{
    using (XmlTextReader reader = new XmlTextReader(XmlPath))
    {
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element && reader.Name == "Student")
            {
                string id = reader.GetAttribute("Id");
                // 继续读取子节点...
            }
        }
    }
}

// XML 转 JSON(配合前台 Ajax)
string XmlToJson(string xmlPath)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(xmlPath);
    return Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc);
}

总结:ASP.NET Web Forms 项目中 XML 操作最佳实践

场景推荐方式
快速绑定 GridView/DropDownListDataSet.ReadXml
代码最简洁、易维护XDocument (LINQ to XML)
复杂增删改查XmlDocument + XPath
文件很大(几十MB)XmlTextReader/Writer 流式
新项目或可重构优先考虑 JSON + 类(Xml 已过时)

有具体的 XML 结构或业务需求(比如省市区三级联动、菜单权限、导入导出等),直接发给我,我给你最合适的完整代码!

文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部