Fork me on GitHub

LINQ to XML学习笔记

一、XML基础知识

1、XML:可扩展标记语言 Extensible Markup Language ,提供了一种保存数据的格式,数据可以通过这种格式很容易地在不同的应用程序之间实现共享。

2、使用XML可以创建自己的标记语言。

3、XML和HTML是两种不同用途的语言,其中最主要的区别是:XML是专门用来描述文本的结构,而HTML是用来如何显示文本的。

4、XML是用来存储数据的,可以作为微型数据库。

5、XML中的元素

(1)XML中的元素是用来描述此文档所包含的数据,XML中有且只有一个根元素,其他元素是在根元素的内部以树状结构来显示的

(2)XML中元素分为非空元素和空元素两种类型

6、XML中的属性

(1)属性是指将一些额外的信息附加到元素上,从而使文档对元素数据描述得更加具体

(2)属性一般在开始标记中声明,由属性名和值构成

7、XML命名空间

(1)定义:XML命名空间是XML文档中所使用元素或属性名称的集合,它在元素或属性名称上加以限度,避免名称相同的元素或者属性发生冲突

(2)XML命名空间由前缀和本地部分组成,中间用:隔开,前缀标识元素或属性所在的命名空间,本地部分标识名称空间中的某个元素或属性

(3)命名空间的范围采用就近原则

 二、XML文件基本操作

使用LINQ to XML时,需要添加System.XML.Linq命名空间

XDocument类:表示XML文档,其中Save方法用来将此XDocument序列化为文件,TextWriter或XmlWriter

                      public void Save(string fileName)

        Root属性:用来获取XML文件中的XML树的根元素:public XElement Root{get;}

        Descendants方法:用来按文档顺序返回此文档或元素的经过筛选的子代元素集合,集合中只包括具有匹配XName的元素:public IEnumerable<XElement>Descendant(XName name)

XDocumentType类:表示XML文档类型定义DTD,该类的构造函数用来初始化XDocumentType类的新实例:public XDocumentType(string name,string publicId,string systemId,string internalSubset)

                        name:一个包含DTD的限定名的字符串,此名称与XML文档的根元素的限定名相同

                        publicId:一个字符串,其中包含外部公共DTD的公共标识符

                        systemId:一个字符串,其中包含外部专用DTD的系统标识符

                        internalSubset:一个字符串,其中包含内部DTD的内部子集

XDeclaration类:表示XML的一个声明

        public XDeclaration(string version,string encoding,string standalone)

XElement类:表示一个XML类

                      public XElement(XName name,Object content)

        name:一个包含元素名称的XName

             content:元素的内容

                     Load方法 :public static XElement Load(string path)

        Element方法:public XElement Element(XNmae name):获取具有制定XName的第一个子元素

        Elements方法:该方法用来按文档顺序返回此元素或文档的经过筛选的子元素的集合,集合中只包括具有匹配XName的元素:public IEnumerable<XElement>Elements<XName name>

                     Attribute方法:该方法用来返回具有指定XName的XElement的XAttribute:public XAttribute Attribute(XName name)

       Parent属性:该属性用来获取XElement对象的父级节点:public XElement Parent{get;}

                    Name属性:获取XML元素的名称:public XName Name{get;set;}

       Value属性:获取XML元素的连接的文本内容:public string Value{get;set;}

                   Add方法:将指定的内容添加到为此XContainer的子级:public void Add(object content)

                   Save方法:该序列化XML元素的基础XML树,科技奖输出保存到文件、XmlTextWriter、TextWriter或XmlWriter等:public void Save(string fileName)

                   SetAttributeValue方法:该方法用来设置XML属性的值、添加XML属性或移除XML属性:public void SetAttributeValue(XName name,object value)

                   ReplaceNodes方法:该方法使用制定的内容替换XML文档或XML元素的子节点:public void RepaceNodes(object content)

                   ReplaceAll方法:用来使用指定的内容替换XML元素的子节点和属性:public void ReplaceAll(Object[]content)

                  ReplaceAttributes方法:删除当前元素中的所有属性

Extensions类:包含LINQ to XML技术的扩展方法

                  Nodes方法:用来返回源集合中的每个文档和元素的子节点的集合:public static IEnumerable<XNode>Nodes<T>(this IEnumerable<T>source)where T:XContainer

                             T:source中对象的类型    source:一个包含源集合的XNode的IEnumerable<T>    返回值:源集合中每个文档和元素的子节点的XNode的IEnumerable<T>

                  Ancestors方法:返回元素集合,其中包含源集合中每个节点的上级:public static IEnumerable<XElment>Ancestors<T>(this IEnumerable<T>source) where T:XNode

                  DescendantNodes方法:用来返回源集合中每个文档和元素的子代节点的集合:public static IEnumerable<XNode>DescendantNodes<T>(this IEnumerable<T>source) where T:XContainer

                  Attributes方法:用来返回源集合中每个元素的属性的集合:public static IEnumerable<XAttruibute>Attributes(this IEnumerable<XElement>source)

XComment类:表示一个XML注释:public XComment(string value)

XAttribute类:表示一个XML属性

      Name属性:用来获取XML属性的展开名称:public XName Name{get;}

                 Value属性:获取或设置XML的属性值:public string Value{get;set;}

XNode类:表示XML树中节点的抽象概念

                 Remove方法用来从节点父级中删除当前节点:public void Remove()

1、使用LINQ技术创建XML文件

static string strPath = "Employee.xml";

        //创建XML文件
        private void button1_Click(object sender, EventArgs e)
        {
            XDocument doc = new XDocument(//创建XML文档对象
                new XDeclaration("1.0", "utf-8", "yes"),//添加XML文件声明
                new XElement(textBox1.Text,//创建XML元素
                    new XElement(textBox2.Text, new XAttribute(textBox3.Text, textBox10.Text),//为XML元素添加属性
                        new XElement(textBox4.Text, textBox5.Text),
                        new XElement(textBox6.Text, textBox7.Text),
                        new XElement(textBox8.Text, textBox9.Text))
                    )
                );
            doc.Save(strPath);//保存XML文档
            MessageBox.Show("XML文件创建成功");
        }

2、读取XML文件

static string strPath = "Employee.xml";
        static string strID = "";

        //窗体加载时加载XML文件
        private void Form1_Load(object sender, EventArgs e)
        {
            getXmlInfo();
        }

        //显示选中XML节点的详细信息
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            strID = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();//记录选择的职工编号
            XElement xe = XElement.Load(strPath);//加载XML文件
            //使用LINT从XML文件中查询信息
            IEnumerable<XElement> elements = from PInfo in xe.Elements("People")
                                             where PInfo.Attribute("ID").Value == strID
                                             select PInfo;
            foreach (XElement element in elements)//遍历查询结果
            {
                textBox11.Text = element.Element("Name").Value;//显示职工姓名
                comboBox1.SelectedItem = element.Element("Sex").Value;//显示职工性别
                textBox12.Text = element.Element("Salary").Value;//显示职工薪水
            }
        }

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// </summary>
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();
            myds.ReadXml(strPath);
            dataGridView1.DataSource = myds.Tables[0];
        }
        #endregion

3、查询操作

private void Frm_Main_Load(object sender, EventArgs e)
        {
            string xmlFilePath = "Employee.xml";//xml文件存放的路径
            XDocument doc = XDocument.Load(xmlFilePath);//加载xml文件
            label1.Text="根元素为:"+doc.Root.Name;//查询根元素
        }

4、查找指定名称的元素

string xmlFilePath = "Employee.xml";//xml文件存放的路径
            XElement xes = XElement.Load(xmlFilePath);//加载xml文件
            //查询指定名称的元素
            IEnumerable<XElement> elements = from ee in xes.Elements("People")
                                             where ee.Element("Name").Value == "小科"
                                             select ee;
            label1.Text = "查找指定名称的元素:\n";
            foreach (XElement xe in elements)//将查询到的元素输出
            {
                label1.Text += xe.Name.LocalName + "" + xe.Attribute("ID").Value + "\n";
            }

5、查找指定属性的元素

private void Frm_Main_Load(object sender, EventArgs e)
        {
            LoadData("");
        }
        private void LoadData(string idcard)
        {
            string xmlFilePath = "Employee.xml";//xml文件存放的路径
            XElement xes = XElement.Load(xmlFilePath);//加载xml文件
            if (idcard == "")
            {
                //查询所有的元素
                var elements = from ee in xes.Elements("Person")
                               select new
                               {
                                   姓名 = ee.Element("Name").Value,
                                   性别 = ee.Element("Sex").Value,
                                   年龄 = ee.Element("Age").Value,
                                   身份证号 = ee.Attribute("IDCard").Value
                               };
                dataGridView1.DataSource = elements.ToList();
            }
            else
            {
                //查询指定名称的元素
                var elements = from ee in xes.Elements("Person")
                               where ee.Attribute("IDCard").Value == idcard
                               select new
                               {
                                   姓名 = ee.Element("Name").Value,
                                   性别 = ee.Element("Sex").Value,
                                   年龄 = ee.Element("Age").Value,
                                   身份证号 = ee.Attribute("IDCard").Value
                               };
                dataGridView1.DataSource = elements.ToList();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            LoadData(comboBox1.Text);
        }

6、遍历指定节点下的所有对象

private void Frm_Main_Load(object sender, EventArgs e)
        {
            //使用LINQ创建xml文件的内容
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219771012***"),
                        new XComment("身份证号是唯一的"),
                        new XElement("Name", "张三"),
                        new XElement("Sex", ""),
                        new XElement("Old", 20),
                        new XText("这是文本对象")
                        )
                    )
                );
            IEnumerable<XNode> nods = doc.Element("People").Elements("Person").Nodes();//取Person节点下的所有对象
            foreach (XNode nod in nods)//遍历查找到的对象
            {
                string s = nod.ToString();//获取对象
                label1.Text += s + "\n";//将对象显示到窗体中
            }
        }

7、返回指定节点下的注释

private void Frm_Main_Load(object sender, EventArgs e)
        {
            //使用LINQ创建xml文件的内容
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219771012***"),
                        new XComment("身份证号必须唯一"),
                        new XElement("Name", "张三"),
                        new XElement("Sex", ""),
                        new XElement("Age", 20),
                        new XComment("年龄不得超过120岁")
                        )
                    )
                );
            IEnumerable<XComment> cmts = doc.Element("People").Elements("Person").Nodes().OfType<XComment>();//取Person节点下的所有注释
        //Enumerable类的OfType方法筛选指定类型的元素
foreach (XComment cmt in cmts)//遍历查找到的注释 { string s = cmt.ToString();//将注释HTML编码 label1.Text += s + "\n";//将注释显示到窗体中 } }


8、访问指定节点的父节点

private void Frm_Main_Load(object sender, EventArgs e)
        {
            //使用LINQ创建xml文件的内容
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219771012***"),
                        new XElement("Name", "张三"),
                        new XElement("Sex", ""),
                        new XElement("Age", 34)
                        ),
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219901111***"),
                        new XElement("Name", "李四"),
                        new XElement("Sex", ""),
                        new XElement("Age", 20)
                        )
                    )
                );
            XElement eleName = doc.Descendants("Name").Where(itm => itm.Value == "张三").First();//查找值等于"张三"的<Name>元素
            XElement xe = eleName.Parent;//获取父节点
            label1.Text=xe.ToString();//将父节点的内容输出
        }

9、返回节点集合中每个节点的所有上级节点

private void Frm_Main_Load(object sender, EventArgs e)
        {
            //使用LINQ创建XML
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219771012***"),
                        new XElement("Name", "张三"),
                        new XElement("Sex", ""),
                        new XElement("Age", 34)
                        ),
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219901111***"),
                        new XElement("Name", "李四"),
                        new XElement("Sex", ""),
                        new XElement("Age", 20)
                        )
                    )
                );
            IEnumerable<XElement> elements = doc.Element("People").Descendants("Name");    //取所有的Name元素
            label1.Text="显示源元素\n";
            foreach (XElement element in elements)//遍历输出Name元素
            {
                label1.Text += "元素名称:" + element.Name + "   元素值:" + element.Value + "\n";
            }
            label1.Text += "显示每个源元素的祖先元素\n";
            foreach (XElement element in elements.Ancestors())//遍历输出每个Name元素的所有上级节点
            {
                label1.Text += "元素名称:" + element.Name + "   元素值:" + element.Value + "\n";
            }
        }

10、返回节点集合中每个节点的所有下级节点

private void Frm_Main_Load(object sender, EventArgs e)
        {
            //使用LINQ创建XML
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219771012***"),
                        new XElement("Name", "张三"),
                        new XElement("Sex", ""),
                        new XElement("Age", 34)
                        ),
                    new XElement("Person",
                        new XAttribute("IDCard", "22030219901111***"),
                        new XElement("Name", "李四"),
                        new XElement("Sex", ""),
                        new XElement("Age", 20)
                        )
                    )
                );
            IEnumerable<XElement> elements = doc.Element("People").Elements("Person");//查询Person元素
            label1.Text += "显示源元素\n";
            foreach (XElement element in elements)//遍历并输出Person元素
            {
                label1.Text += "元素名称:" + element.Name + "   元素值:" + element.Value + "\n";
            }
            label1.Text += "显示每个源元素的子孙节点\n";
            foreach (XNode nod in elements.DescendantNodes())//遍历并输出所有的下级节点
            {
                label1.Text += "子孙节点:" + nod.ToString() + "\n";
            }
        }

11、返回元素集合中每个元素的所有属性

private void Frm_Main_Load(object sender, EventArgs e)
        {
            //使用LINQ创建XML
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    new XElement("Person",
                        new XAttribute("Name", "张三"),
                        new XAttribute("Sex", ""),
                        new XAttribute("Age", 34),
                        new XElement("IDCard", "22030219771012***")
                        ),
                    new XElement("Person",
                        new XAttribute("Name", "李四"),
                        new XAttribute("Sex", ""),
                        new XAttribute("Age", 20),
                        new XElement("IDCard", "22030219901111***")
                        )
                    )
                );
            IEnumerable<XElement> elements = doc.Element("People").Elements("Person");//查询Person元素
            label1.Text="显示源元素\n";
            foreach (XElement element in elements)//遍历输出Person元素
            {
                label1.Text += "元素名称:" + element.Name + "   元素值:" + element.Value + "\n";
            }
            label1.Text += "显示每个源元素的属性\n";
            foreach (XAttribute attr in elements.Attributes())//遍历每个源元素的属性
            {
                label1.Text += "属性名称:" + attr.Name + "   属性值:" + attr.Value + "\n";
            }
        }

三、元素操作

1、向XML文件中添加数据

static string strPath = "Employee.xml";//记录XML文件路径

        //窗体加载时加载XML文件
        private void Form1_Load(object sender, EventArgs e)
        {
            if (File.Exists(strPath))
            {
                getXmlInfo();
            }
        }

        //添加XML元素
        private void button2_Click(object sender, EventArgs e)
        {
            XElement xe = XElement.Load(strPath);//加载XML文档
            IEnumerable<XElement> elements1 = from element in xe.Elements("People")//创建IEnumerable泛型接口对象
                                              select element;
            //生成新的编号
            string str = (Convert.ToInt32(elements1.Max(element => element.Attribute("ID").Value)) + 1).ToString("000");
            XElement people = new XElement(//创建XML元素
                "People", new XAttribute("ID", str),//为XML元素设置属性
                new XElement("Name", textBox11.Text),
                new XElement("Sex", comboBox1.Text),
                new XElement("Salary", textBox12.Text)
                );
            xe.Add(people);//添加XML元素
            xe.Save(strPath);//保存XML元素到XML文件
            getXmlInfo();
        }

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// </summary>
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();//创建DataSet数据集对象
            myds.ReadXml(strPath);//读取XML结构
            dataGridView1.DataSource = myds.Tables[0];//在DataGridView中显示XML文件中的信息
        }
        #endregion

2、修改XML文件中的数据

static string strPath = "Employee.xml";//记录XML文件路径
        static string strID = "";//记录选中的ID编号

        //窗体加载时加载XML文件
        private void Form1_Load(object sender, EventArgs e)
        {
            if (File.Exists(strPath))
            {
                getXmlInfo();
            }
        }

        //修改XML元素
        private void button3_Click(object sender, EventArgs e)
        {
            if (strID != "")//判断是否选择了编号
            {
                XElement xe = XElement.Load(strPath);//加载XML文档
                IEnumerable<XElement> elements = from element in xe.Elements("People")//根据编号查找信息
                                                 where element.Attribute("ID").Value == strID
                                                 select element;
                if (elements.Count() > 0)//判断是否找到了信息
                {
                    XElement newXE = elements.First();//获取找到的第一条记录
                    newXE.SetAttributeValue("ID", strID);//为XML元素设置属性值
                    newXE.ReplaceNodes(//替换XML元素中的值
                        new XElement("Name", textBox11.Text),
                        new XElement("Sex", comboBox1.Text),
                        new XElement("Salary", textBox12.Text)
                        );
                }
                xe.Save(strPath);//保存XML元素到XML文件
            }
            MessageBox.Show("修改成功");
            getXmlInfo();
        }

        //显示选中XML节点的详细信息
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            strID = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();//记录选中的ID编号
            XElement xe = XElement.Load(strPath);//加载XML文档
            IEnumerable<XElement> elements = from PInfo in xe.Elements("People")//根据编号查找信息
                                             where PInfo.Attribute("ID").Value == strID
                                             select PInfo;
            foreach (XElement element in elements)//遍历查找到的所有信息
            {
                textBox11.Text = element.Element("Name").Value;//显示员工姓名
                comboBox1.SelectedItem = element.Element("Sex").Value;//显示员工性别
                textBox12.Text = element.Element("Salary").Value;//显示员工薪水
            }
        }

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// </summary>
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();//创建DataSet数据集对象
            myds.ReadXml(strPath);//读取XML结构
            dataGridView1.DataSource = myds.Tables[0];//在DataGridView中显示XML文件中的信息
        }
        #endregion
    }

3、替换指定节点下的所有元素

private void Frm_Main_Load(object sender, EventArgs e)
        {
            string path = "new.xml";//取XML文件的全路径
            XElement xe = XElement.Load(path);//加载XML文件
            //用LINQ查找要修改的元素
            IEnumerable<XElement> element = from ee in xe.Elements("Person")
                                            where ee.Attribute("IDCard").Value == "22030219901111***"
                                            && ee.Element("Name").Value == "李四"
                                            select ee;
            if (element.Count() > 0)//存在要修改的元素
            {
                XElement first = element.First();//取第一个元素
                //全部替换成新的节点
                first.ReplaceAll(
                    new XAttribute("IDCard", "22030219891111XXX"),
                    new XElement("Name", "李丽"),
                    new XElement("Sex", ""),
                    new XElement("Age", 21)
                    );
            }
            xe.Save(path);//保存文件
            webBrowser1.Url = new Uri(Application.StartupPath + "\\" + path);//在窗体中显示XML文件内容
        }


4、删除XML中的数据

static string strPath = "Employee.xml";//记录XML文件路径
        static string strID = "";//记录选中的ID编号

        //窗体加载时加载XML文件
        private void Form1_Load(object sender, EventArgs e)
        {
            if (File.Exists(strPath))
            {
                getXmlInfo();
            }
        }

        //删除XML元素
        private void button4_Click(object sender, EventArgs e)
        {
            if (strID != "")//判断是否选择了编号
            {
                XElement xe = XElement.Load(strPath);//加载XML文档
                IEnumerable<XElement> elements = from element in xe.Elements("People")//根据编号查找信息
                                                 where element.Attribute("ID").Value == strID
                                                 select element;
                if (elements.Count() > 0)//判断是否找到了信息
                    elements.First().Remove();//删除找到的XML元素信息
                xe.Save(strPath);//保存XML元素到XML文件
            }
            MessageBox.Show("删除成功");
            getXmlInfo();
        }

        //显示选中XML节点的详细信息
        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            strID = dataGridView1.Rows[e.RowIndex].Cells[3].Value.ToString();//记录选中的ID编号
            XElement xe = XElement.Load(strPath);//加载XML文档
            IEnumerable<XElement> elements = from PInfo in xe.Elements("People")//根据编号查找信息
                                             where PInfo.Attribute("ID").Value == strID
                                             select PInfo;
            foreach (XElement element in elements)//遍历查找到的所有信息
            {
                textBox11.Text = element.Element("Name").Value;//显示员工姓名
                comboBox1.SelectedItem = element.Element("Sex").Value;//显示员工性别
                textBox12.Text = element.Element("Salary").Value;//显示员工薪水
            }
        }

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// </summary>
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();//创建DataSet数据集对象
            myds.ReadXml(strPath);//读取XML结构
            dataGridView1.DataSource = myds.Tables[0];//在DataGridView中显示XML文件中的信息
        }
        #endregion
    }

5、合计XML元素值 Sum

private void Frm_Main_Load(object sender, EventArgs e)
        {
            string path = "new.xml";//取XML文件全路径
            XElement xe = XElement.Load(path);//加载XML文件
            //用LINQ查询Person元素
            IEnumerable<XElement> element = from ee in xe.Elements("Person")
                                            select ee;
            decimal ageSum = element.Sum(itm => Convert.ToDecimal(itm.Element("Age").Value));//计算年龄合计
            label1.Text = "年龄合计:" + ageSum.ToString() + "";//输出合计值
        }

6、添加属性到XML文件中

private void Frm_Main_Load(object sender, EventArgs e)
        {
            string xmlFilePath =Application.StartupPath+"\\new.xml";//取XML文件的全路径
            XElement xe = XElement.Load(xmlFilePath);//加载XML文件
            //用LINQ查找要操作的元素
            IEnumerable<XElement> elements = from ee in xe.Elements("Person")
                                             where ee.Attribute("IDCard").Value == "22030219901111***"
                                             && ee.Element("Name").Value == "李四"
                                             select ee;
            if (elements.Count() > 0)//存在要操作的元素
            {
                XElement first = elements.First();
                //添加一个备注属性
                first.Add(
                    new XAttribute("Memo", "她是一个女学生")
                    );
            }
            xe.Save(xmlFilePath);//保存XML文件
            webBrowser1.Url = new Uri(xmlFilePath);//在窗体中显示XML文件内容
        }

7、修改元素的属性值

private void Frm_Main_Load(object sender, EventArgs e)
        {
            string xmlFilePath = Application.StartupPath+"\\new.xml";//取XML文件的全路径
            XElement xe = XElement.Load(xmlFilePath);//加载XML文件
            //用LINQ查找要操作的元素
            IEnumerable<XElement> elements = from ee in xe.Elements("Person")
                                             where ee.Attribute("IDCard").Value == "22030219901111***"
                                             && ee.Element("Name").Value == "李四"
                                             select ee;
            if (elements.Count() > 0)//存在要操作的元素
            {
                XElement first = elements.First();//取第一个元素
                first.Attribute("IDCard").Value = "22030219891222XXX";//修改属性值
            }
            xe.Save(xmlFilePath);//保存XML文件
            webBrowser1.Url = new Uri(xmlFilePath);//在窗体中显示XML
        }

 8、添加文档类型到XML

private void Frm_Main_Load(object sender, EventArgs e)
        {
            string xmlFilePath = Application.StartupPath+"\\new.xml";//取出xml文件的全路径
            XDocument doc = new XDocument(
                new XDocumentType("People", null, "People.dtd", null),//添加文档类型
                new XElement("People", "员工信息")//添加根元素
                );
            doc.Save(xmlFilePath);//保存XML文件
            webBrowser1.Url = new Uri(xmlFilePath);//在窗体中显示XML文件
        }

9、使用LINQ to XML转换XML

private void Frm_Main_Load(object sender, EventArgs e)
        {
            DataClassesDataContext dc = new DataClassesDataContext();//创建LINQ to SQL数据上下文类的对象
            string xmlFilePath = Application.StartupPath + "\\new.xml";//取出xml文件的全路径
            //使用LINQ to XML创建XML
            XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("People",
                    from p in dc.tb_Employee//根据LINQ to SQL取出的数据生成XML
                    select new XElement[]{
                new XElement("Person",
                new XAttribute("ID",p.ID),
                new XElement("Name",p.Name),
                new XElement("Sex",p.Sex),
                new XElement("Age", p.Age),
                new XElement("Tel",p.Tel),
                new XElement("QQ",p.QQ),
                new XElement("Email", p.Email),
                new XElement("Address", p.Address)
                )}
                    )
                );
            doc.Save(xmlFilePath);//保存XML文件
            webBrowser1.Url = new Uri(xmlFilePath);//在窗体中呈现XML文件的内容
        }

10、读取XML文件并更新到数据库

InsertOnSubmit方法用来将处于pending insert状态的实体添加到数据库:void InsertOnSubmit(object entity)

SubmitChanges方法用来将处于pending insert状态的实体添加到数据表

static string strPath = "Employee.xml";//记录XML文件路径
        //定义数据库连接字符串
        string strCon = "Data Source=WIN-GI7E47AND9R\\LS;Database=db_TomeTwo;Uid=sa;Pwd=;";
        linqtosqlDataContext linq; //创建Linq连接对象

        //窗体加载时加载XML文件
        private void Form1_Load(object sender, EventArgs e)
        {
            if (File.Exists(strPath))
            {
                getXmlInfo();
            }
        }

        //将数据更新到数据库
        private void btn_Edit_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)//遍历所有行
            {
                linq = new linqtosqlDataContext(strCon);//创建linq连接对象
                tb_XML xml = new tb_XML();//创建tb_XML对象
                xml.ID = dataGridView1.Rows[i].Cells[3].Value.ToString();//为ID赋值
                xml.Name = dataGridView1.Rows[i].Cells[0].Value.ToString();//为Name赋值
                xml.Sex = dataGridView1.Rows[i].Cells[1].Value.ToString();//为Sex赋值
                xml.Salary = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value);//为Salary赋值
                linq.tb_XML.InsertOnSubmit(xml);//提交数据
                linq.SubmitChanges();//执行对数据库的修改
                linq.Dispose();//释放linq对象
            }
            MessageBox.Show("成功将XML中的数据更新到了数据库中!");//弹出提示
        }

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// </summary>
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();//创建DataSet数据集对象
            myds.ReadXml(strPath);//读取XML结构
            dataGridView1.DataSource = myds.Tables[0];//在DataGridView中显示XML文件中的信息
        }
        #endregion

 

 

 

 

 

 

 

 

 

posted @ 2013-08-29 16:31  种花生的读书人  阅读(708)  评论(0编辑  收藏  举报

该博客仅作为记录笔记,转载随意