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

(图片来源网络,侵删)
- 配置文件:ASP.NET 的核心配置文件
Web.configXML 格式的。 - 数据存储:对于小型应用,可以用 XML 文件作为简单的数据库,无需安装数据库服务器。
- 数据交换:作为不同系统之间数据交换的标准格式(Web Service, API 等)。
- RSS/Atom Feed:用于生成新闻订阅源。
- 报表生成:将数据导出为结构化的 XML 文件。
准备工作:创建一个 ASP.NET Web 项目
- 打开 Visual Studio。
- 选择 "创建新项目"。
- 选择 "ASP.NET Web 应用程序"。
- 给项目命名,
XmlDemo。 - 在 "创建新 ASP.NET Web 应用程序" 窗口中,可以选择 "空" 模板或 "Web Forms" 模板,本教程适用于两者,但为了简单,我们使用 "空" 模板,然后添加一个 Web Form。
- 在项目中,创建一个名为
App_Data的文件夹,用于存放我们的 XML 文件。 - 添加一个 Web Form (
.aspx文件),Default.aspx。 - 添加一个按钮或一个链接,用于触发后台代码执行。
核心类库简介
System.Xml 命名空间
这是处理 XML 的传统类库,基于 W3C DOM 标准,它功能强大,但有时代码会显得冗长。
XmlDocument:代表整个 XML 文档,你可以把它想象成 XML 文件在内存中的完整副本,你可以加载、查询、修改和保存整个文档。XmlNode:XmlDocument中的任何节点(元素、属性、注释等)都是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 属性。XNode:XElement和XAttribute的基类。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 中:

(图片来源网络,侵删)
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.xml 中 id="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 中删除 Category 为 Books 的所有产品节点。
使用 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 文件。
准备工作
-
在 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 -
在 ASP.NET 项目中,添加一个连接字符串到
Web.config:<connectionStrings> <add name="MyCompanyDB" connectionString="Data Source=.;Initial Catalog=MyCompany;Integrated Security=True;" providerName="System.Data.SqlClient" /> </connectionStrings>
使用 DataSet 和 XmlDataDocument 实现
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 的所有结构和数据。
最佳实践与性能考量
- 优先使用
XDocument:对于绝大多数新项目,XDocument(LINQ to XML) 是更好的选择,它语法更简洁,查询更强大,内存效率通常也更高。 - 处理文件路径:始终使用
Server.MapPath()来获取服务器上的物理路径,不要使用硬编码的绝对路径。 - 异常处理:文件操作(
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}"; } - 资源释放:对于数据库连接、文件流等资源,使用
using语句可以确保它们被正确地、及时地释放。 - 大文件处理:XML 文件非常大(几百MB或GB),使用
XmlDocument会将整个文件加载到内存中,可能导致内存不足,应考虑使用XmlReader和XmlWriter进行流式读取和写入,它们不会一次性加载整个文件。
本教程涵盖了 ASP.NET 中处理 XML 的核心操作,从传统的 XmlDocument 到现代的 XDocument,通过多个实例,你应该已经掌握了如何:
- 读取 XML 文件并展示数据。
- 创建 新的 XML 文件。
- 修改 和 删除 XML 文件中的现有数据。
- 将数据库数据导出 为 XML 格式。
虽然 XmlDocument 功能全面,但 XDocument 凭借其简洁的语法和强大的 LINQ 查询能力,已成为 .NET 开发者处理 XML 的首选工具,希望这个教程能帮助你更好地在 ASP.NET 项目中应用 XML 技术。
