漫话Linq——Linq To XML
Linq TO XML技术交流学习案例:
#region 全局变量 /// <summary> /// XML path /// </summary> public String x_Path = String.Empty; /// <summary> /// 查询关键字 x_Name /// </summary> public String key = String.Empty; /// <summary> /// DataSet ds /// </summary> public DataSet ds = new DataSet(); /// <summary> /// x_Id /// </summary> public static String x_Id = String.Empty; #endregion #region 读取数据 /// <summary> /// 加载数据 one /// </summary> public void LoadXML_One() { /* * 此种方式绑定到 GridView 不能支持 GridView自带的分页功能, * 并且还不稳定,容易出错(不推荐) */ //加载 XML XElement elements = XElement.Load(x_Path); try { var query = from xm in elements.Elements("ChildNodes") orderby xm.Element("x_Age").Value descending select new //注意前面绑定什么字段(DataField),这里就查询什么字段 { x_Id = xm.Attribute("x_Id").Value.Trim(),//x_Id 是属性 使用 Attribute获取 x_Name = xm.Element("x_Name").Value.Trim(),x_Gender = xm.Element("x_Gender").Value.Trim(),x_Age = xm.Element("x_Age").Value.Trim(),x_Address = xm.Element("x_Address").Value.Trim(),x_Tel = xm.Element("x_Tel").Value.Trim(),x_Remark = xm.Element("x_Remark").Value.Trim() }; this.gvXML.DataSource = query; this.gvXML.DataBind(); } catch (Exception ex) { ClientScript.RegisterStartupScript(GetType(),"","alert('系统异常!具体如下:" + ex.Message.ToString() + "');",true); } } /// <summary> /// 加载数据 Two /// </summary> public void LoadXML_Two() { /* * 方法二比较方法一更稳定,不过有些复杂, * 主要是借助 Linq To DataSet的一些技术(这节知识在后面介绍),* 别且此种方法可以支持 GridView自带分页功能(推荐) */ try { //加载XML文件到 ds中 ds.ReadXml(x_Path); if (ds != null && ds.Tables.Count > 0) { IEnumerable<DataRow> query = from xm in ds.Tables[0].AsEnumerable() orderby xm.Field<String>("x_Age") descending select xm; this.gvXML.DataSource = query.CopyToDataTable(); this.gvXML.DataBind(); } } catch (Exception ex) { ClientScript.RegisterStartupScript(GetType(),true); } } #endregion /// <summary> /// 查询方式一 /// </summary> public void SearchXML_One() { XElement elements = XElement.Load(x_Path); var query = from xm in elements.Elements("ChildNodes") where xm.Element("x_Name").Value.Contains(key) orderby xm.Element("x_Age") descending select new { x_Id = xm.Attribute("x_Id").Value.Trim(),//x_Id 是属性 使用 Attribute获取 x_Name = xm.Element("x_Name").Value.Trim(),x_Remark = xm.Element("x_Remark").Value.Trim() }; if (query != null) { this.gvXML.DataSource = query; this.gvXML.DataBind(); } } /// <summary> /// 查询方式二 /// </summary> public void SearchXML_Two() { /* * 此种查询方式较第一种更稳定,压力也会更大 */ ds = new DataSet(); ds.ReadXml(x_Path); if (ds != null && ds.Tables.Count > 0) { IEnumerable<DataRow> query = from xm in ds.Tables[0].AsEnumerable() where xm.Field<String>("x_Name").Contains(key) orderby xm.Field<String>("x_Age") descending select xm; if (query != null) { if (query.Count() > 0) { this.gvXML.DataSource = query.CopyToDataTable(); this.gvXML.DataBind(); } else { ClientScript.RegisterStartupScript(GetType(),"alert('查询的信息不存在');",true); } } } } /// <summary> /// 提交信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnSubmit_Click(object sender,EventArgs e) { if (!IsEmpty()) { try { XElement elements = XElement.Load(x_Path); if (String.IsNullOrEmpty(x_Id)) //新增 { XElement new_Child = new XElement("ChildNodes",new XAttribute("x_Id",Guid.NewGuid()),new XElement("x_Name",this.tBox_Name.Text.Trim()),new XElement("x_Gender",this.tBox_Gender.Text.Trim()),new XElement("x_Age",this.tBox_Age.Text.Trim()),new XElement("x_Address",this.tBox_Address.Text.Trim()),new XElement("x_Tel",this.tBox_Tel.Text.Trim()),new XElement("x_Remark",this.tBox_Remark.Text.Trim()) ); elements.Add(new_Child); elements.Save(x_Path); } else { //修改 IEnumerable<XElement> element = from xm in elements.Elements("ChildNodes") where xm.Attribute("x_Id").Value.Equals(x_Id) select xm; if (element != null && element.Count() > 0) { XElement first = element.First(); first.SetElementValue("x_Name",this.tBox_Name.Text.Trim()); first.SetElementValue("x_Gender",this.tBox_Gender.Text.Trim()); first.SetElementValue("x_Age",this.tBox_Age.Text.Trim()); first.SetElementValue("x_Address",this.tBox_Address.Text.Trim()); first.SetElementValue("x_Tel",this.tBox_Tel.Text.Trim()); first.SetElementValue("x_Remark",this.tBox_Remark.Text.Trim()); elements.Save(x_Path); } } ClientScript.RegisterStartupScript(GetType(),"alert('" + (String.IsNullOrEmpty(x_Id) == true ? "添加" : "修改") + "成功!');",true); LoadXML_Two(); //隐藏 this.dt_Add.Attributes.Add("style","display: none;"); //清空 Clearn(); } catch (Exception ex) { ClientScript.RegisterStartupScript(GetType(),true); } } else { ClientScript.RegisterStartupScript(GetType(),"alert('输入不为空!');",true); this.dt_Add.Attributes.Remove("style"); } } /// <summary> /// 删除信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvXML_RowDeleting(object sender,GridViewDeleteEventArgs e) { String x_Id = this.gvXML.DataKeys[e.RowIndex].Value.ToString().Trim(); if (!String.IsNullOrEmpty(x_Id)) { XElement elements = XElement.Load(x_Path); IEnumerable<XElement> element = from xm in elements.Elements("ChildNodes") where xm.Attribute("x_Id").Value.Trim().Equals(x_Id) select xm; if (element.Count() > 0) { //删除 element.First().Remove(); elements.Save(x_Path); //重新加载 LoadXML_Two(); ClientScript.RegisterStartupScript(GetType(),"alert('删除成功成功!');",true); } } } 扩充: #region DataSet、查询结果 转化为XML /// <summary> /// 转化为XML /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void ButnGetXML_Click(object sender,EventArgs e) { XDocument xdm = new XDocument( new XDeclaration("1.0","utf-8","yes"),new XComment("这里声明相关属性"),new XElement("RootNode",new XComment("这是一个父节点"),from es in dc.EA_Script where es.Id <= 150 select new XElement[]{ new XElement("ChildNodes",new XComment("这里是子节点"),es.Id),new XElement("x_Title",es.Title),new XElement("x_Url",es.FName),new XElement("x_Detail",es.Detail),new XElement("x_Downloads",es.Downloads),new XElement("x_DateTime",es.DateTime.ToString()) )} ) ); xdm.Save(x_Path); ClientScript.RegisterStartupScript(GetType(),"alert('创建XML文件成功!')",true); } /// <summary> /// DataSet数据转化为XML文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnDSGetXML_Click(object sender,EventArgs e) { StringBuilder strsql = new StringBuilder(); strsql.Append("SELECT TOP(88) * FROM [dbo].EA_Script es ORDER BY es.Id DESC"); con = new sqlConnection(ConnectionString); sda = new sqlDataAdapter(strsql.ToString(),con); try { DataSet ds = new DataSet(); sda.Fill(ds,"DSGetXML"); ds.WriteXml(x_Path); } catch (Exception ex) { ClientScript.RegisterStartupScript(GetType(),"alert('DataSet创建DataSetXML文件失败!\n" + ex.Message + "')",true); } finally { sda.Dispose(); ds.Dispose(); if (con.State == ConnectionState.Open) con.Close(); } ClientScript.RegisterStartupScript(GetType(),"alert('DataSet创建DataSetXML文件成功!')",true); } #endregion