第一步:创建一个ASP.NET项目,项目名称为“MyLinqPro”,新建一个名为” XMLPage.aspx”的aspx页面。整个解决方案资源管理器如图所示:
第二步:在页面做如下布局,视图为:
代码效果图:
具体的前台代码为:
<%@ PageLanguage="C#"AutoEventWireup="true"CodeFile="XMLPage.aspx.cs"Inherits="XMLPage"%>
<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>使用Linq技术操作Xml</title>
<style type="text/css">
body
{
padding:0px;
line-height:1.0;
font-size:12px;
}
a
{
text-decoration:none;
color:#666;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:LinkButton ID="btnCreate" runat="server" Text="创建XML" OnClick="btnCreate_Click"></asp:LinkButton>
<asp:Label ID="Label1" runat="server" Width="60"></asp:Label>
<asp:LinkButton ID="btnShow" runat="server" Text="显示学生信息" OnClick="btnShow_Click"></asp:LinkButton>
<asp:Label runat="server" ID="Label2" Width="60"></asp:Label>
<asp:LinkButton ID="btnAdd" runat="server" Text="添加学生信息" οnclick="btnAdd_Click"></asp:LinkButton>
<asp:GridView ID="gvStudent" runat="server" AutoGenerateColumns="False" Width="60%">
<Columns>
<asp:BoundField DataField="ID" HeaderText="编号" />
<asp:BoundField DataField="Name" HeaderText="姓名" />
<asp:BoundField DataField="Age" HeaderText="年龄" />
<asp:BoundField DataField="Sex" HeaderText="性别" />
<asp:BoundField DataField="Address" HeaderText="联系地址" />
<asp:TemplateField HeaderText="操作">
<ItemTemplate>
<asp:LinkButton ID="btnUpdate" runat="server" Text="修改" OnClick="btnUpdate_Click"CommandArgument='<%#Eval("ID")%>'>
</asp:LinkButton>
<asp:LinkButton ID="btnDelete" runat="server" Text="删除" CommandArgument='<%#Eval("ID")%>'
OnClientClick="returnconfirm('您确定要删除吗?');" OnClick="btnDelete_Click"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<SelectedRowStyle BackColor="#D1DDF1" ForeColor="#333333" Font-Bold="True" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<HeaderStyle BackColor="#99C89D"Font-Bold="True"ForeColor="White"/>
<AlternatingRowStyle BackColor="White" />
<RowStyle BackColor="#EFF3FB" HorizontalAlign="Center" />
</asp:GridView>
<asp:Panel ID="pnlTable" runat="server" Width="60%" Visible="false">
<table>
<tr>
<td>编号:</td>
<td><asp:Label ID="lblID" runat="server"></asp:Label></td>
</tr>
<tr>
<td>姓名:</td>
<td><asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>年龄:</td>
<td><asp:TextBox ID="txtAge" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>性别:</td>
<td>
<asp:RadioButtonList ID="rdoSex" runat="server"RepeatDirection="Horizontal"Width="120">
<asp:ListItem Text="男" Value="男" Selected="True"></asp:ListItem>
<asp:ListItem Text="女" Value="女"></asp:ListItem>
</asp:RadioButtonList>
</td>
</tr>
<tr>
<td>联系地址:</td>
<td><asp:TextBox ID="txtAddress" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td>
</td>
<td><asp:LinkButton ID="btnSave" runat="server" Text="保存" OnClick="btnSave_Click"/></td>
</tr>
</table>
</asp:Panel>
</div>
</form>
</body>
</html>
后台代码的效果图为:
具体代码为:
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Data;
usingSystem.IO;
usingSystem.Linq;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Xml.Linq; //引入命名空间
usingSystem.Xml;
public partial class XMLPage : System.Web.UI.Page
{
protected void Page_Load(objectsender, EventArgs e)
{
if(!IsPostBack)
{
ViewState.Clear(); //页面首次加载,清空所有的ViewState
}
}
/// <summary>
/// 单击“创建XML”按钮,创建Xml文档
/// </summary>
protected void btnCreate_Click(objectsender, EventArgs e)
{
/*
* 使用Linq操作Xml非常方便,可以在创建Xml节点时,清晰地看出
* 新节点的结构。节点的实际结构非常相似!
*/
XElementelements = new XElement("Students",
newXElement("Student", //创建Student节点
newXElement("ID",1), //创建ID节点
newXElement("Name","刘备"), //创建Name节点
newXElement("Age","25"), //创建Age节点
newXElement("Sex","男"), //创建Sex节点
newXElement("Address","四川成都") //创建Address节点
),
new XElement("Student", //创建Student节点
newXElement("ID",2), //创建ID节点
newXElement("Name","张飞"), //创建Name节点
newXElement("Age","22"), //创建Age节点
newXElement("Sex","男"), //创建Sex节点
newXElement("Address","四川成都") //创建Address节点
),
newXElement("Student", //创建Student节点
newXElement("ID",3), //创建ID节点
newXElement("Name","关羽"), //创建Name节点
newXElement("Age","24"), //创建Age节点
newXElement("Sex","男"), //创建Sex节点
new XElement("Address","四川成都") //创建Address节点
),
new XElement("Student", //创建Student节点
newXElement("ID",4), //创建ID节点
newXElement("Name","诸葛亮"), //创建Name节点
newXElement("Age","20"), //创建Age节点
newXElement("Sex","男"), //创建Sex节点
newXElement("Address","隆中") //创建Address节点
),
new XElement("Student", //创建Student节点
newXElement("ID",5), //创建ID节点
newXElement("Name","貂婵"), //创建Name节点
newXElement("Age","21"), //创建Age节点
newXElement("Sex","女"), //创建Sex节点
newXElement("Address","北京") //创建Address节点
)
);
elements.Save(@"c:\Student.xml");//将整个XML文档保存到C:\Student.xml
}
/// <summary>
/// 单击"显示学生信息"按钮,显示所有学生的信息
/// </summary>
protected void btnShow_Click(objectsender, EventArgs e)
{
DataSetdataSet = new DataSet(); //声明一个DateSet变量
XmlDocumentdocument = new XmlDocument();//声明一个XmlDocument变量
document.Load(@"C:\Student.xml"); //加载整个Xml文档
StringReaderReader = new StringReader(document.InnerXml);//声明一个StringReader类型的变量
XmlTextReadertextReader = new XmlTextReader(Reader);//声明一个XmlTextReader类型的变量
dataSet.ReadXml(textReader); //读取XmlTextReader中的Xml内容,并填充到DataSet中
textReader.Close(); //关闭XmlTextReader对象
Reader.Close(); //关闭StringReader对象
if(dataSet.Tables.Count > 0) //如果Xml中有数据
gvStudent.DataSource =dataSet.Tables[0]; //指定数据源
gvStudent.DataBind(); //调用GridView控件的DataBind()方法,绑定数据
}
/// <summary>
/// 单击“删除”按钮,将相应的学生信息从Xml文件中删除
/// </summary>
protected void btnDelete_Click(objectsender, EventArgs e)
{
stringID = ((LinkButton)sender).CommandArgument; //获取学生的ID编号,用于唯一标识学生信息
if (string.IsNullOrEmpty(ID) == false) //如果学生的ID编号不为空
{
XDocumentdocument = XDocument.Load(@"c:\Student.xml"); //加载整个Xml文档
//遍历整个Xml文档,查询出名称为ID的单个节点,并且该节点的值等于传进来的学生编号
XElementelement = document.Element("Students").Elements().SingleOrDefault<XElement>
(ele => ele.Element("ID").Name == "ID"&& ele.Element("ID").Value== ID);
if(element != null)//如果该节点不为空
{
element.Remove(); //将该节点从Xml中删除
document.Save(@"C:\Student.xml"); //记住,要重新保存Xml文档
OrderStudentIdASC(); //删除后,对学生的编号进行重新的升序排列
}
btnShow_Click(null, null); //模拟“显示学生信息”按钮,重新显示最新的学生信息
}
}
protected void btnUpdate_Click(objectsender, EventArgs e)
{
stringID = ((LinkButton)sender).CommandArgument; //获取当前修改的学生的编号
if (string.IsNullOrEmpty(ID) == false)//如果学生的编号不为空
{
ViewState["ID"]= ID; //使用ViewState保存当前的学生编号,以便单击“保存”按钮时可以方便的获取当前的学生的编号
XDocumentdocument = XDocument.Load(@"c:\Student.xml");//加载整个Xml文档
//遍历整个Xml文档,查询出名称为ID的单个节点,并且该节点的值等于传进来的学生编号
XElementelement = document.Element("Students").Elements().SingleOrDefault<XElement>(ele => ele.Element("ID").Value == ID);
if(element != null) //如果该节点不为空
{
pnlTable.Visible = true; //显示编辑区域的Panel控件
txtAddress.Text =element.Element("Address").Value; //为“联系地址”文本框赋值
txtAge.Text = element.Element("Age").Value; //为“年龄”文本框赋值
lblID.Text = element.Element("ID").Value; //为“编号”Label标签赋值
txtName.Text = element.Element("Name").Value; //为“姓名”文本框赋值
rdoSex.SelectedValue =element.Element("Sex").Value; //选中相应的性别
ViewState["Modify"] = "Update"; //使用ViewState["Modify"]保存,表示当前处于“修改”状态
}
ViewState.Remove("ID");//从ViewState中删除Key为“ID”的对象,以避免不必要的资源浪费
}
}
/// <summary>
/// 单击“保存”按钮,保存学生信息
/// </summary>
protected void btnSave_Click(objectsender, EventArgs e)
{
if(ViewState["Modify"].ToString() =="Update") //如果当前处于修改状态
{
stringID = (string)ViewState["ID"]; //获取学生的编号ID
if(!string.IsNullOrEmpty(ID)) //如果学生的编号ID不为空
{
XDocumentdocument = XDocument.Load(@"c:\Student.xml"); //加载整个Xml文档
//获取“Students”节点下的一个“Student”节点,
//该节点的子节点名称为“ID”,前该子节点的值等于当前的学生编号
XElementelement = document.Element("Students").Elements().SingleOrDefault<XElement>(ele =>
ele.Element("ID").Name == "ID"&& ele.Element("ID").Value== ID);
if(element != null) //如果该“Studnet”节点不为空
{
element.Element("Address").Value = txtAddress.Text; //为子节点“Address”赋值
element.Element("Age").Value = txtAge.Text; //为子节点“Age”赋值
element.Element("ID").Value = lblID.Text; //为子节点“ID”赋值
element.Element("Name").Value = txtName.Text; //为子节点“Name”赋值
element.Element("Sex").Value =rdoSex.SelectedValue; //为子节点“Sex”赋值
}
document.Save(@"C:\Student.xml"); //保存XML文档
}
}
else if ((string)ViewState["Modify"] == "Add") //如果当前处于添加状态
{
XElementelements = XElement.Load(@"C:\Student.xml"); //加载整个Xml文档
XElementnewElement = new XElement("Student", //创建一个Student节点,表示一个学生对象
newXElement("ID",GetNewId()), //创建ID节点,并赋值为最新获取的学生编号
new XElement("Name",txtName.Text), //创建Name节点并赋值,表示学生的姓名
newXElement("Age",txtAge.Text), //创建Age节点并赋值,表示学生的年龄
newXElement("Sex",rdoSex.SelectedValue), //创建Sex节点并赋值,表示学生的性别
new XElement("Address", txtAddress.Text) //创建Address节点并赋值,表示学生的联系地址
);
elements.Add(newElement); //向Xml文档中添加新创建的学生节点newElement
elements.Save(@"C:\Student.xml"); //保存整个Xml文档
}
pnlTable.Visible = false; //隐藏添加区域的Panel控件
ViewState.Remove("Modify"); //将“当前的状态信息”,从ViewState中删除
btnShow_Click(null,null); //模拟“显示学生信息”按钮,重新显示最新的学生信息
}
/// <summary>
/// “添加学生信息”按钮的单击事件
/// </summary>
protected void btnAdd_Click(objectsender, EventArgs e)
{
ViewState["Modify"]= "Add"; //使用ViewState["Modify"]保存,表示当前处于“添加”状态
lblID.Text = ""; //清空编号Label标签中的值
txtAddress.Text = ""; //清空“地址”文本框中的值
txtAge.Text = ""; //清空“年龄”文本框中的值
txtName.Text = ""; //清空“姓名”文本框中的值
rdoSex.SelectedValue = "男"; //默认选中的学生姓名为“男”
pnlTable.Visible = true; //显示“添加学生信息”区域的Panel控件
}
/// <summary>
/// 从所有的学生编号中,获取新的学生编号
/// </summary>
/// <returns>新的学生编号</returns>
private int GetNewId()
{
XDocumentdocument = XDocument.Load(@"c:\Student.xml"); //加载整个Xml文档
IList<int> array = new List<int>(); //声明一个变量保存所有学生编号的集合
//所有学生编号
array = document.Element("Students").Elements().Select(e => Convert.ToInt32(e.Element("ID").Value)).ToList<int>();
intnewId = array.Max<int>() + 1; //获取最大的学生编号,并且加1,作为新的学生编号
returnnewId; //返回最新的学生编号
}
/// <summary>
/// 重新升序排列学生的编号
/// </summary>
private void OrderStudentIdASC()
{
XDocumentdocument = XDocument.Load(@"c:\Student.xml"); //加载整个Xml文档
int i =1; //声明一个变量i,表示起始的学生编号
//循环遍历Xml文档下Students节点的的所有Student子节点
foreach(XElement element indocument.Element("Students").Elements())
{
element.Element("ID").Value = i.ToString(); //将学生编号赋值为当前的编号变量i
i++; //自动增加编号i的值
}
document.Save(@"c:\Student.xml"); //重新保存Xml文档
}
}
最后,测试一下吧!
运行页面,首先单击“创建Xml”按钮,再单击“显示学生信息”按钮,效果如图:
点击“添加学生信息”按钮,如图:
输入一些测试的数据,
点击“保存”,新增加了学生”吕布”信息!
由于篇幅有限,其它“修改”,“删除”操作读者可以自己运行!