ASP.NET XML 实例教程

目录

  1. 引言:为什么在 ASP.NET 中使用 XML?
  2. 准备工作:创建一个 ASP.NET Web 项目
  3. 核心类库简介
    • System.Xml 命名空间
    • XmlDocument (DOM - 文档对象模型)
    • XDocument / LINQ to XML (推荐方式)
  4. 实例 1:读取和显示 XML 数据
    • 场景:从 XML 文件读取产品列表并显示在网页上。
    • 使用 XmlDocument 实现。
    • 使用 XDocument (LINQ to XML) 实现。
  5. 实例 2:动态创建 XML 文件
    • 场景:根据用户输入,动态生成一个 XML 文件。
    • 使用 XmlDocument 实现。
    • 使用 XDocument (LINQ to XML) 实现。
  6. 实例 3:修改现有 XML 文件
    • 场景:更新 XML 文件中某个节点的值。
    • 使用 XmlDocument 实现。
    • 使用 XDocument (LINQ to XML) 实现。
  7. 实例 4:删除 XML 文件中的节点
    • 场景:删除 XML 文件中指定的节点。
    • 使用 XmlDocument 实现。
    • 使用 XDocument (LINQ to XML) 实现。
  8. 实例 5:将数据库数据导出为 XML
    • 场景:从 SQL Server 数据库读取数据并生成 XML 文件。
    • 使用 DataSetXmlDataDocument 实现。
  9. 最佳实践与性能考量

引言:为什么在 ASP.NET 中使用 XML?

XML (eXtensible Markup Language) 是一种用于存储和传输数据的标记语言,在 ASP.NET 开发中,XML 非常有用:

asp.net xml 实例教程
(图片来源网络,侵删)
  • 配置文件:ASP.NET 的核心配置文件 Web.config XML 格式的。
  • 数据存储:对于小型应用,可以用 XML 文件作为简单的数据库,无需安装数据库服务器。
  • 数据交换:作为不同系统之间数据交换的标准格式(Web Service, API 等)。
  • RSS/Atom Feed:用于生成新闻订阅源。
  • 报表生成:将数据导出为结构化的 XML 文件。

准备工作:创建一个 ASP.NET Web 项目

  1. 打开 Visual Studio。
  2. 选择 "创建新项目"。
  3. 选择 "ASP.NET Web 应用程序"。
  4. 给项目命名,XmlDemo
  5. 在 "创建新 ASP.NET Web 应用程序" 窗口中,可以选择 "空" 模板或 "Web Forms" 模板,本教程适用于两者,但为了简单,我们使用 "空" 模板,然后添加一个 Web Form。
  6. 在项目中,创建一个名为 App_Data 的文件夹,用于存放我们的 XML 文件。
  7. 添加一个 Web Form (.aspx 文件),Default.aspx
  8. 添加一个按钮或一个链接,用于触发后台代码执行。

核心类库简介

System.Xml 命名空间

这是处理 XML 的传统类库,基于 W3C DOM 标准,它功能强大,但有时代码会显得冗长。

  • XmlDocument:代表整个 XML 文档,你可以把它想象成 XML 文件在内存中的完整副本,你可以加载、查询、修改和保存整个文档。
  • XmlNodeXmlDocument 中的任何节点(元素、属性、注释等)都是 XmlNode 的子类。
  • XmlElement:代表 XML 元素(如 <product>)。
  • XmlAttribute:代表 XML 元素的属性(如 id="1")。
  • XmlNodeList:代表一个节点集合(如多个 <product> 节点)。

XDocument / LINQ to XML (推荐方式)

这是 .NET 3.5 引入的新 API,使用 LINQ (Language Integrated Query) 技术,它更现代、更简洁、更易于使用,是目前处理 XML 的首选方法。

  • XDocument:代表整个 XML 文档。
  • XElement:代表 XML 元素,是 XDocument 的核心。
  • XAttribute:代表 XML 属性。
  • XNodeXElementXAttribute 的基类。
  • IEnumerable<XElement>:查询结果通常是一个可枚举的元素集合,非常适合使用 foreach 循环。

实例 1:读取和显示 XML 数据

XML 文件 (App_Data/products.xml)

App_Data 文件夹中创建一个 products.xml 文件。

<?xml version="1.0" encoding="utf-8"?>
<Products>
  <Product id="1">
    <Name>Laptop</Name>
    <Price>1200</Price>
    <Category>Electronics</Category>
  </Product>
  <Product id="2">
    <Name>Keyboard</Name>
    <Price>75</Price>
    <Category>Electronics</Category>
  </Product>
  <Product id="3">
    <Name>C# Programming Book</Name>
    <Price>45</Price>
    <Category>Books</Category>
  </Product>
</Products>

场景:在 Default.aspx 页面上,点击一个按钮,将所有产品信息以 HTML 表格的形式显示出来。

使用 XmlDocument 实现

Default.aspx.cs 中:

asp.net xml 实例教程
(图片来源网络,侵删)
using System;
using System.Web.UI;
using System.Xml; // 引入命名空间
public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // 页面首次加载时不执行
        if (!IsPostBack)
        {
            // 绑定数据
            BindDataWithXmlDocument();
        }
    }
    protected void btnShowProducts_Click(object sender, EventArgs e)
    {
        BindDataWithXmlDocument();
    }
    private void BindDataWithXmlDocument()
    {
        string filePath = Server.MapPath("~/App_Data/products.xml");
        XmlDocument doc = new XmlDocument();
        doc.Load(filePath);
        // 创建一个 HTML 表格字符串
        string htmlTable = "<table border='1' cellpadding='5' cellspacing='0'>";
        htmlTable += "<tr><th>ID</th><th>Name</th><th>Price</th><th>Category</th></tr>";
        // 获取所有的 Product 节点
        XmlNodeList productList = doc.SelectNodes("//Product");
        foreach (XmlNode productNode in productList)
        {
            string id = productNode.Attributes["id"].Value;
            string name = productNode.SelectSingleNode("Name").InnerText;
            string price = productNode.SelectSingleNode("Price").InnerText;
            string category = productNode.SelectSingleNode("Category").InnerText;
            htmlTable += $"<tr><td>{id}</td><td>{name}</td><td>{price}</td><td>{category}</td></tr>";
        }
        htmlTable += "</table>";
        // 将生成的 HTML 输出到 Literal 控件中
        litXmlOutput.Text = htmlTable;
    }
}

使用 XDocument (LINQ to XML) 实现

这是更推荐的方式,代码更简洁。

using System;
using System.Web.UI;
using System.Xml.Linq; // 引入 LINQ to XML 命名空间
using System.Linq;     // 引入 LINQ 命名空间
public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindDataWithXDocument();
        }
    }
    protected void btnShowProducts_Click(object sender, EventArgs e)
    {
        BindDataWithXDocument();
    }
    private void BindDataWithXDocument()
    {
        string filePath = Server.MapPath("~/App_Data/products.xml");
        XDocument doc = XDocument.Load(filePath);
        // 使用 LINQ to XML 查询
        var products = from product in doc.Descendants("Product")
                       select new
                       {
                           Id = product.Attribute("id").Value,
                           Name = product.Element("Name").Value,
                           Price = product.Element("Price").Value,
                           Category = product.Element("Category").Value
                       };
        string htmlTable = "<table border='1' cellpadding='5' cellspacing='0'>";
        htmlTable += "<tr><th>ID</th><th>Name</th><th>Price</th><th>Category</th></tr>";
        foreach (var p in products)
        {
            htmlTable += $"<tr><td>{p.Id}</td><td>{p.Name}</td><td>{p.Price}</td><td>{p.Category}</td></tr>";
        }
        htmlTable += "</table>";
        litXmlOutput.Text = htmlTable;
    }
}

实例 2:动态创建 XML 文件

场景:点击按钮,根据代码中的数据,在 App_Data 文件夹中创建一个 new_products.xml 文件。

使用 XmlDocument 实现

private void CreateXmlWithXmlDocument()
{
    string filePath = Server.MapPath("~/App_Data/new_products.xml");
    // 创建根节点
    XmlDocument doc = new XmlDocument();
    XmlElement root = doc.CreateElement("Products");
    doc.AppendChild(root);
    // 创建产品1
    XmlElement product1 = doc.CreateElement("Product");
    product1.SetAttribute("id", "101");
    XmlElement name1 = doc.CreateElement("Name");
    name1.InnerText = "Mouse";
    product1.AppendChild(name1);
    XmlElement price1 = doc.CreateElement("Price");
    price1.InnerText = "25";
    product1.AppendChild(price1);
    root.AppendChild(product1);
    // 创建产品2
    XmlElement product2 = doc.CreateElement("Product");
    product2.SetAttribute("id", "102");
    XmlElement name2 = doc.CreateElement("Name");
    name2.InnerText = "Monitor";
    product2.AppendChild(name2);
    XmlElement price2 = doc.CreateElement("Price");
    price2.InnerText = "300";
    product2.AppendChild(price2);
    root.AppendChild(product2);
    // 保存文件
    doc.Save(filePath);
    litXmlOutput.Text = $"成功创建 XML 文件于: {filePath}";
}

使用 XDocument (LINQ to XML) 实现

private void CreateXmlWithXDocument()
{
    string filePath = Server.MapPath("~/App_Data/new_products_linq.xml");
    // 使用函数式构建 XML,非常直观
    XDocument doc = new XDocument(
        new XElement("Products",
            new XElement("Product", new XAttribute("id", "101"),
                new XElement("Name", "Mouse"),
                new XElement("Price", "25")
            ),
            new XElement("Product", new XAttribute("id", "102"),
                new XElement("Name", "Monitor"),
                new XElement("Price", "300")
            )
        )
    );
    // 保存文件,格式化输出(缩进)
    doc.Save(filePath);
    litXmlOutput.Text = $"成功创建 XML 文件于: {filePath}";
}

对比XDocument 的方式代码量更少,结构更清晰,可读性极高。


实例 3:修改现有 XML 文件

场景:将 products.xmlid="1" 的产品的价格修改为 1100

使用 XmlDocument 实现

private void ModifyXmlWithXmlDocument()
{
    string filePath = Server.MapPath("~/App_Data/products.xml");
    XmlDocument doc = new XmlDocument();
    doc.Load(filePath);
    // 查找要修改的节点
    XmlNode productNode = doc.SelectSingleNode("//Product[@id='1']");
    if (productNode != null)
    {
        // 找到价格节点
        XmlNode priceNode = productNode.SelectSingleNode("Price");
        if (priceNode != null)
        {
            priceNode.InnerText = "1100";
            doc.Save(filePath);
            litXmlOutput.Text = "成功修改产品价格为 1100!";
        }
    }
    else
    {
        litXmlOutput.Text = "未找到 ID 为 1 的产品。";
    }
}

使用 XDocument (LINQ to XML) 实现

private void ModifyXmlWithXDocument()
{
    string filePath = Server.MapPath("~/App_Data/products.xml");
    XDocument doc = XDocument.Load(filePath);
    // 使用 LINQ 查找要修改的元素
    XElement productElement = doc.Descendants("Product")
                                 .FirstOrDefault(p => (string)p.Attribute("id") == "1");
    if (productElement != null)
    {
        // 找到价格元素并设置新值
        productElement.Element("Price").Value = "1100";
        doc.Save(filePath);
        litXmlOutput.Text = "成功修改产品价格为 1100!";
    }
    else
    {
        litXmlOutput.Text = "未找到 ID 为 1 的产品。";
    }
}

实例 4:删除 XML 文件中的节点

场景:从 products.xml 中删除 CategoryBooks 的所有产品节点。

使用 XmlDocument 实现

private void DeleteNodeWithXmlDocument()
{
    string filePath = Server.MapPath("~/App_Data/products.xml");
    XmlDocument doc = new XmlDocument();
    doc.Load(filePath);
    // 找到所有要删除的节点
    XmlNodeList nodesToDelete = doc.SelectNodes("//Product[Category='Books']");
    if (nodesToDelete.Count > 0)
    {
        // 从父节点中移除
        foreach (XmlNode node in nodesToDelete)
        {
            node.ParentNode.RemoveChild(node);
        }
        doc.Save(filePath);
        litXmlOutput.Text = $"成功删除 {nodesToDelete.Count} 个书籍产品。";
    }
    else
    {
        litXmlOutput.Text = "没有找到要删除的书籍产品。";
    }
}

使用 XDocument (LINQ to XML) 实现

private void DeleteNodeWithXDocument()
{
    string filePath = Server.MapPath("~/App_Data/products.xml");
    XDocument doc = XDocument.Load(filePath);
    // 找到所有要删除的元素
    var elementsToDelete = doc.Descendants("Product")
                              .Where(p => (string)p.Element("Category") == "Books")
                              .ToList(); // 必须先 ToList(),因为集合在迭代时会改变
    if (elementsToDelete.Any())
    {
        elementsToDelete.ForEach(el => el.Remove());
        doc.Save(filePath);
        litXmlOutput.Text = $"成功删除 {elementsToDelete.Count} 个书籍产品。";
    }
    else
    {
        litXmlOutput.Text = "没有找到要删除的书籍产品。";
    }
}

实例 5:将数据库数据导出为 XML

场景:从 SQL Server 数据库查询数据,并生成一个 XML 文件。

准备工作

  1. 在 SQL Server 中创建一个数据库和一个表 Employees

    CREATE DATABASE MyCompany;
    GO
    USE MyCompany;
    GO
    CREATE TABLE Employees (
        Id INT PRIMARY KEY,
        Name NVARCHAR(50),
        Department NVARCHAR(50),
        Salary DECIMAL(10, 2)
    );
    GO
    INSERT INTO Employees VALUES (1, 'Alice', 'HR', 5000.00);
    INSERT INTO Employees VALUES (2, 'Bob', 'IT', 7500.50);
    INSERT INTO Employees VALUES (3, 'Charlie', 'IT', 8200.00);
    GO
  2. 在 ASP.NET 项目中,添加一个连接字符串到 Web.config

    <connectionStrings>
      <add name="MyCompanyDB" 
           connectionString="Data Source=.;Initial Catalog=MyCompany;Integrated Security=True;" 
           providerName="System.Data.SqlClient" />
    </connectionStrings>

使用 DataSetXmlDataDocument 实现

using System.Data;
using System.Data.SqlClient;
private void ExportDatabaseToXml()
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyCompanyDB"].ConnectionString;
    string xmlFilePath = Server.MapPath("~/App_Data/employees_export.xml");
    // 1. 使用 SqlDataAdapter 填充 DataSet
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Employees", con);
        DataSet ds = new DataSet();
        adapter.Fill(ds, "Employee");
        // 2. 使用 XmlDataDocument 将 DataSet 转换为 XML
        XmlDataDocument xmlDoc = new XmlDataDocument(ds);
        // 3. 保存为 XML 文件
        xmlDoc.Save(xmlFilePath);
        litXmlOutput.Text = $"成功从数据库导出 XML 文件到: {xmlFilePath}";
    }
}

生成的 employees_export.xml 会包含 DataSet 的所有结构和数据。


最佳实践与性能考量

  1. 优先使用 XDocument:对于绝大多数新项目,XDocument (LINQ to XML) 是更好的选择,它语法更简洁,查询更强大,内存效率通常也更高。
  2. 处理文件路径:始终使用 Server.MapPath() 来获取服务器上的物理路径,不要使用硬编码的绝对路径。
  3. 异常处理:文件操作(Load, Save)可能会因为文件不存在、权限不足等原因抛出异常,建议使用 try-catch 块来处理这些异常。
    try
    {
        XDocument doc = XDocument.Load(filePath);
        // ... 操作 ...
        doc.Save(filePath);
    }
    catch (System.IO.FileNotFoundException ex)
    {
        litXmlOutput.Text = $"错误:文件未找到 - {ex.Message}";
    }
    catch (Exception ex)
    {
        litXmlOutput.Text = $"发生未知错误 - {ex.Message}";
    }
  4. 资源释放:对于数据库连接、文件流等资源,使用 using 语句可以确保它们被正确地、及时地释放。
  5. 大文件处理:XML 文件非常大(几百MB或GB),使用 XmlDocument 会将整个文件加载到内存中,可能导致内存不足,应考虑使用 XmlReaderXmlWriter 进行流式读取和写入,它们不会一次性加载整个文件。

本教程涵盖了 ASP.NET 中处理 XML 的核心操作,从传统的 XmlDocument 到现代的 XDocument,通过多个实例,你应该已经掌握了如何:

  • 读取 XML 文件并展示数据。
  • 创建 新的 XML 文件。
  • 修改删除 XML 文件中的现有数据。
  • 将数据库数据导出 为 XML 格式。

虽然 XmlDocument 功能全面,但 XDocument 凭借其简洁的语法和强大的 LINQ 查询能力,已成为 .NET 开发者处理 XML 的首选工具,希望这个教程能帮助你更好地在 ASP.NET 项目中应用 XML 技术。