咨询电话:186 7916 6165 咨询电话:186 7916 6165 (微信同号)    在线QQ:181796286
NEWS BLOG ·
学无止境
关注开优网络 关注前沿
ASP.NET 生成缩略图、加水印
ASP.NET上传文件

Linq To Xml (增,删,改,查)

发表日期:2015-11-11    文章编辑:南昌开优网络    浏览次数:3865    标签:ASP.NET应用

XML数据如下:Test.xml

<?xml version="1.0" encoding="utf-8"?> 

<DataSet>    

  <dbName ID="b785723f-e7ef-448a-81b2-527de05f422a" Name="aaaaaa" Remarks="r-aa" />

  <dbName ID="53232faa-a069-46b1-8ff4-f5bf47db7a68" Name="bbbbb" Remarks="r-bbbb" />

</DataSet>

一、查询

程序代码:

XElement root = XElement.Load(Server.MapPath("Test.xml"));          //加载需要操作的XML文件

IEnumerable<XElement> tests =

    from el in root.Elements("dbName")                //查询dbName节点 Elements 为节点

    where (string)el.Attribute("Remarks") == "r-aa" //条件:节点的Remarks属性的值为 r-aaAttribute 为属性

    select el;

foreach (XElement el in tests)                            //遍历查询结果

{

    Response.Write((string)el.Attribute("Name") + "<br>");  //输出查询节点的Name属性的值

}

输出结果:

aaaaaa

二、添加节点

程序代码:

XElement root = XElement.Load(Server.MapPath("Test.xml"));  //加载需要操作的XML文件

root .Add(new XElement("newNode", "newNodes"));         //添加一个名为newNode,值为newNodes的节点

输出结果:

<?xml version="1.0" encoding="utf-8"?>    

<DataSet>    

  <dbName ID="b785723f-e7ef-448a-81b2-527de05f422a" Name="aaaaaa" Remarks="r-aa" />

  <dbName ID="53232faa-a069-46b1-8ff4-f5bf47db7a68" Name="bbbbb" Remarks="r-bbbb" />

  <newNode>newNodes</newNode>  

</DataSet>

三、删除节点

程序代码:

XElement root = XElement.Load(Server.MapPath("Test.xml"));                //加载需要操作的XML文件

IEnumerable<XElement> tests =

    from el in root.Elements("dbName")                //查询dbName节点

    where (string)el.Attribute("Remarks") == "r-aa"   //条件:节点的Remarks属性的值为 r-aa

    select el;

foreach (XElement el in tests)                            //遍历查询结果

{

    el.RemoveNodes();  //删除查询节点的Name属性的值

}

输出结果:

<?xml version="1.0" encoding="utf-8"?>

<DataSet>       

  <dbName ID="53232faa-a069-46b1-8ff4-f5bf47db7a68" Name="bbbbb" Remarks="r-bbbb" />  

</DataSet>


四、修改节点

程序代码:

XElement root = XElement.Load(Server.MapPath("Test.xml"));   //加载需要操作的XML文件

IEnumerable<XElement> tests =

    from el in root.Elements("dbName")                  //查询dbName节点

    where (string)el.Attribute("Remarks") == "r-aa"  //条件:节点的Remarks属性的值为 r-aa

    select el;

foreach (XElement el in tests)    //遍历查询结果

{

    el.SetValue("cccc");              //修改查询节点的Name属性的值

}

输出结果:

<?xml version="1.0" encoding="utf-8"?>

<DataSet>

  <dbName ID="b785723f-e7ef-448a-81b2-527de05f422a" Name="cccc" Remarks="r-aa" />

  <dbName ID="53232faa-a069-46b1-8ff4-f5bf47db7a68" Name="bbbbb" Remarks="r-bbbb" />

</DataSet>


例子:

xml文件 xixi.xml 

<?xml version="1.0" encoding="utf-8"?>

<data>

<config>

    <roundCorner>0</roundCorner>


    <autoPlayTime>5</autoPlayTime>

    <isHeightQuality>false</isHeightQuality>

    <blendMode>normal</blendMode>


</config>

<channel>

    <item>

      <title>测试1</title>

      <image>/upload/20121031/4e43c84e-b4d5-4f72-98f1-68e9f92c76da.jpg</image>

      <link>http://www.baidu.com</link>

      <time>2012-10-31 15:34:12</time>

    </item>

    <item>

      <title>测试2</title>

      <image>/upload/20121031/7340b809-adc3-458f-a408-fb5bce3917c9.jpg</image>

      <link>bbab</link>

      <time>2012-10-31 15:38:14</time>

    </item>

</channel>

</data>

使用Linq操作channel节点中的item节点

1、Repeater控制绑定xml

if (!Page.IsPostBack)

{

    XmlDocument xml = new XmlDocument();        //创建xml对象

    xml.Load(HttpContext.Current.Server.MapPath("~/xml/xixi.xml"));    //打开xixi.xml文件

    rep.DataSource = xml.DocumentElement.SelectSingleNode("channel").ChildNodes;    //获取SelectSingleNode指定节点的第一个下的所有节点

    rep.DataBind();

}

前台显示:

<asp:HiddenField ID="hfOpreate" Value="add" runat="server" />    //隐藏域用于判断是添加还是修改

<asp:HiddenField ID="hftitle" runat="server" />                //隐藏域用于保存传入的title值

<%@import namespace="System.Xml"%>    //在前台的aspx文件中引用Xml的命名空间

<asp:Repeater ID="rep" runat="server">

    <ItemTemplate>

        <tr>

            <td style="border-right: 1px solid #ccc;" align="center">               

                <%#((XmlNode)Container.DataItem).SelectSingleNode("title").InnerText%>    //获取SelectSingleNode指定节点中的文本指

                <!--<%# ((XmlNode)Container.DataItem).Attributes["title"].Value %>-->    //获取节点的Attributes属性

            </td>

            <td style="border-right: 1px solid #ccc;" align="center">

                <img src='<%#((XmlNode)Container.DataItem).SelectSingleNode("image").InnerText%>' width="150px" height="93" />    //获取图片节点的文本

            </td>

            <td style="border-right: 1px solid #ccc;" align="center">

                <%#((XmlNode)Container.DataItem).SelectSingleNode("time").InnerText%>    //获取时间节点的文本

            </td>

            <td align="center">

<asp:LinkButton ID="lbtnDel" CommandArgument='<%#((XmlNode)Container.DataItem).SelectSingleNode("title").InnerText%>' OnClientClick="return confirm('确定删除吗?');" runat="server" OnClick="del">删除</asp:LinkButton>

<asp:LinkButton ID="lbtnRep" OnClick="edit" CommandArgument='<%#((XmlNode)Container.DataItem).SelectSingleNode("title").InnerText %>' runat="server">修改</asp:LinkButton>

            </td>

        </tr>

    </ItemTemplate>

</asp:Repeater>

后台:

protected void Page_Load(object sender, EventArgs e)

{

    if (!Page.IsPostBack)

    {

        XmlDocument xml = new XmlDocument();

        xml.Load(HttpContext.Current.Server.MapPath("~/xml/xixi.xml"));    //打开文本

        rep.DataSource = xml.DocumentElement.SelectSingleNode("channel").ChildNodes;    //绑定指定节点下的所有子节点

        rep.DataBind();

    }

}

//上传

protected void btnUpload_Click(object sender, EventArgs e)

{

    try

    {

        string fimg = Xiaobin.Utility.Tool.Upload(fuimg, new string[] { ".jpg", ".png" }, 1, Server.MapPath("../upload/"));

        img.ImageUrl = "../upload/" + fimg;

        img.ToolTip = fimg;

    }

    catch (Exception ex)

    {

        Xiaobin.Utility.Tool.Alert(ex.Message, this.Page);

    }

}

//保存

protected void btnAdd_Click(object sender, EventArgs e)

{

    string title = txttitle.Text.Trim();

    string image = "/upload/" + img.ToolTip;        //加上upload保存到xml文件中

    string link = txtlink.Text.Trim();

    if (title.Length == 0 || image.Length == 0 || link.Length == 0)

    {

        Xiaobin.Utility.Tool.Alert("请输入完整再提交", this.Page);

        return;

    }

    XElement element = XElement.Load(Server.MapPath("/xml/xixi.xml"));   //打开文件

    if (hfOpreate.Value == "add")   //添加

    {


    IEnumerable<XElement> tests =



        from el in element.Elements("channel").Elements("item")                //查询channel节点下的item节点



        where (string)el.Element("title") == title                           //条件:节点的title属性的值为输入的title值



        select el;



    foreach (XElement el in tests)                            //遍历查询结果



    {



        Xiaobin.Utility.Tool.Alert("标题重复了", this.Page);        //因为删除和修改都是传入title所有。title必须是唯一的 .即查找



        return;



    }


    XElement owenr = new XElement("item", new XElement[]{       //找到item节点并添加子节点

    new XElement("title",title),         //节点title

    new XElement("image",image),//节点image

    new XElement("link",link),                                        //节点link

    new XElement("time",DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), //节点time

    });

        element.Element("channel").Add(owenr); //xml文件的channel节点中加上item节点

    }


string t = hftitle.Value;        //改



if (hfOpreate.Value == "edit")



{



    IEnumerable<XElement> tests =



        from el in element.Elements("channel").Elements("item")



        where (string)el.Element("title") == t                                     //通过hftitle的值查询出xml节点中的title节点,用于修改



        select el;                                                                            //element为xml文件.el为查询出的结果节点



    foreach (XElement el in tests)



    {



        el.Element("title").Value = title;



        el.Element("image").Value = image;



        el.Element("link").Value = link;                 



    }



}

element.Save(Server.MapPath("/xml/xixi.xml"));    //保存


    Xiaobin.Utility.Tool.AlertAndGo("添加成功", Request.Url.ToString(), this.Page);

}

//删除

protected void del(object sender, EventArgs e)

{

    string title = (sender as LinkButton).CommandArgument;        //获取传入的值

    XElement element = XElement.Load(Server.MapPath("/xml/xixi.xml"));                //加载需要操作的XML文件

    IEnumerable<XElement> tests =

        from el in element.Elements("channel").Elements("item")                //查询channel节点下的item节点

        where (string)el.Element("title") == title                          //条件:节点的title属性的值为输入的文本title值

        select el;

    foreach (XElement el in tests)                            //遍历查询结果

    {

        el.Remove();        //移除该节点

    }

    element.Save(Server.MapPath("/xml/xixi.xml"));    //保存

    Xiaobin.Utility.Tool.AlertAndGo("添加成功", Request.Url.ToString(), this.Page);

}

//修改

protected void edit(object sender, EventArgs e)

{

    string title = (sender as LinkButton).CommandArgument;        //获取传入的title

    hfOpreate.Value = "edit";     //修改事件

    hftitle.Value = title;            //用隐藏域存储title用于修改事件

    XElement element = XElement.Load(Server.MapPath("/xml/xixi.xml"));    //打开文件

    IEnumerable<XElement> tests =

        from el in element.Elements("channel").Elements("item")

        where (string)el.Element("title") == title                    //查询节点并判断

        select el;

    foreach (XElement el in tests)

    {

        txtlink.Text = el.Element("link").Value;        //前台的TextBox重新赋值

        txttitle.Text = el.Element("title").Value;

        img.ToolTip = el.Element("image").Value;

        img.ImageUrl = "../upload/" + el.Element("image").Value;    

    }

}

简单的绑定Repeater控件


<?xml version="1.0" encoding="UTF-8"?>     //XML文件 <ThreadList Count="476" fid="103"> <Thread tid="396133" uid="279005" subject="含义和用法即"></Thread> <Thread tid="396132" uid="279005" subject="字母诠释下的夏奈尔></Thread>
<ThreadList>



XmlDocument doc = new XmlDocument();            //.cs代码
doc.LoadXml("xml"); this.repTopicList.DataSource = doc.DocumentElement.ChildNodes; this.repTopicList.DataBind();
<%@ Import Namespace="System.Xml"%>            //前台显示 <asp:Repeater ID="repTopicList" runat="server">  <ItemTemplate> <span><%# ((XmlNode)Container.DataItem).Attributes["subject"].Value%><span><br /> </ItemTemplate></asp:Repeater>