使用Linq操作XML数据

第一步:创建一个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”按钮,再单击“显示学生信息”按钮,效果如图:


点击“添加学生信息”按钮,如图:


输入一些测试的数据,


点击“保存”,新增加了学生”吕布”信息!

由于篇幅有限,其它“修改”,“删除”操作读者可以自己运行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值