代码改变世界

Linq 操作XML文件

2011-05-08 20:27  ※森林小居※  阅读(454)  评论(0编辑  收藏  举报

1.创建Xml树

     <person id="1">
        <name>Gaby</name>
        <age>12</age>
        <address>GuangZhou</address>
    </person>
    <person id="2">
        <name>Bill</name>
        <age>33</ag  e>
        <address>USA</address>
    </person>
    <person id="3">
        <name>BiLy</name>
        <age>19</age>
        <address>HuNan</address>
    </person>
 
 

 如果要创建如上的XML树:

代码示例:

 XElement xmlTree = new XElement("Root", 

                new XElement("person", new XElement("name", "Gaby"),
                                                   new XElement("age",18),
                                                   new XElement("address","GuangZhou")), 

                new XElement("person", new XElement("name", "Lily"),
                                                   new XElement("age",20),
                                                   new XElement("address","USA")),

                new XElement("person", new XElement("name", "Bill"),
                                                   new XElement("age",55),
                                                   new XElement("address","English"))

                                                );

            foreach (var item in xmlTree.Elements())

            {

                Console.WriteLine(item);

            } 

 输出结果:

 

2.读取XML文件

有以下XML文件:path:D:\NetDemo\LinqToXml\LinqToXml\XMLFile.xml

 

 

 

 

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

<persons>

    <person id="1">

        <name>Gaby</name>

        <age>16</age>

        <address>GuangZhou</address>

    </person>

    <person id="2">

        <name>Bill</name>

        <age>33</age>

        <address>USA</address>

    </person>

    <person id="3">

        <name>BiLy</name>

        <age>19</age>

        <address>HuNan</address>

    </person>

    <person id="4">

        <name>James</name>

        <age>16</age>

        <address>English</address>

    </person>

</persons>

读取方法一:
  XElement xml = XElement.Load(@"D:"NetDemo"LinqToXml"LinqToXml"XMLFile.xml");
           Console.WriteLine("读取XML...");
           foreach (var item in xml.Elements("person"))
           {
               Console.WriteLine(item.Element("name").Value+""t"
                               +item.Element("age").Value+""t"
                               +item.Element("address").Value);
           }
 
读取方法二:(查询表达式)
var persons = from p in xml.Elements("person")
                         select new
                         {
                             Name = p.Element("name").Value,
                             Age = p.Element("age").Value,
                             Address = p.Element("address").Value

                         };

Console.WriteLine("读取XML..."); 

  foreach (var item in persons)
           {
               Console.WriteLine(item.Name+"\t"+item.Age+"\t"+item.Address);
           }
读取方法三:(lambada表达式)
  var persons = xml.Elements("person").Select(p => new{
                                                                    Id=p.Attribute("id").Value,  //读取属性
                                                                    Name = p.Element("name").Value,
                                                                    Age = p.Element("age").Value,
                                                                    Address = p.Element("address").Value
                                                                }
                                                        );
 
            foreach (var item in persons)
            {
                Console.WriteLine(item.Name + ""t" + item.Age + ""t" + item.Address);
            }

 输出结果(相同):

 

 

using System.Collections.Generic;

public partial class OperateXML:System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
   ///CreateXmlFile();
   ///AddXmlElement();
   ///UpdateXmlElement();
   ///RemoveXmlElement();
   ConvertXmlAttributeToElement();
    }

private void CreateXmlFile()//创建XML文件
{   ///设置新的XML文件保存的地址
   string xmlFilePath = Server.MapPath("Data/new.xml");
   XDocument doc = new XDocument(
    new XDeclaration("1.0","utf-8","yes"),
    new XElement("Books",
     new XElement("Book",
      new XAttribute("ID","104"),                    ///添加属性ID
      new XElement("No","0004"),                     ///添加元素No
      new XElement("Name","Book 0004"),              ///添加元素Name
      new XElement("Price","300"),                   ///添加元素Price
      new XElement("Remark","This is a book 0004.") ///添加元素Remark
      )
     )
    );
   ///保存为XML文件
   doc.Save(xmlFilePath);
   ///显示XML文件的内容
   Response.Write(doc);
   ///设置网页显示的形式为XML文件
   Response.ContentType = "text/xml";
   Response.End();
}

private void AddXmlElement()//增加元素到XML文件
{
   ///<Book ID="101">
   ///    <No>00001</No>
   ///    <Name>Book 0001</Name>
   ///    <Price>100</Price>
   ///    <Remark>This is a book 00001.</Remark>
   ///</Book>
   ///导入XML文件
   string xmlFilePath = Server.MapPath("Data/Books.xml");
   XElement xe = XElement.Load(xmlFilePath);  
   ///创建一个新的节点
   XElement book = new XElement("Book",
    new XAttribute("ID","104"),                    ///添加属性ID
    new XElement("No","0004"),                     ///添加元素No
    new XElement("Name","Book 0004"),              ///添加元素Name
    new XElement("Price","300"),                   ///添加元素Price
    new XElement("Remark","This is a book 0004.") ///添加元素Remark
    );
   ///添加节点到文件中,并保存
   xe.Add(book);
   xe.Save(xmlFilePath);
   ///显示XML文件的内容
   Response.Write(xe);
   ///设置网页显示的形式为XML文件
   Response.ContentType = "text/xml";
   Response.End();
}

private void UpdateXmlElement()//修改XML文件中的元素
{ ///导入XML文件
   string xmlFilePath = Server.MapPath("Data/Books.xml");
   XElement xe = XElement.Load(xmlFilePath);  
   ///查找被替换的元素
   IEnumerable<XElement> element = from e in xe.Elements("Book")
           where e.Attribute("ID").Value == "104"
           select e;
   ///替换为新元素,并保存
   if (element.Count() > 0)
   {
    XElement first = element.First();   
    ///设置新的属性
    first.SetAttributeValue("ID","106");
    ///替换新的节点
    first.ReplaceNodes(
     new XElement("No","0006"),                     ///添加元素No
     new XElement("Name","Book 0006"),              ///添加元素Name
     new XElement("Price","600"),                   ///添加元素Price
     new XElement("Remark","This is a book 0006.") ///添加元素Remark
     );
   }
   xe.Save(xmlFilePath);
   ///显示XML文件的内容
   Response.Write(xe);
   ///设置网页显示的形式为XML文件
   Response.ContentType = "text/xml";
   Response.End();
}

private void RemoveXmlElement()//删除XML文件中的元素
{  
   ///导入XML文件
   string xmlFilePath = Server.MapPath("Data/Books.xml");
   XElement xe = XElement.Load(xmlFilePath);  
   ///查找被删除的元素
   IEnumerable<XElement> element = from e in xe.Elements()
           where (string)e.Element("Name") == "Book 0003"
           select e;
   ///删除指定的元素,并保存
   if(element.Count() > 0)
   {
    element.First().Remove();
   }
   xe.Save(xmlFilePath);
   ///显示XML文件的内容
   Response.Write(xe);
   ///设置网页显示的形式为XML文件
   Response.ContentType = "text/xml";
   Response.End();
}

private void ConvertXmlAttributeToElement()//将XML文件中的属性转换为元素
{ ///导入XML文件
   string xmlFilePath = Server.MapPath("Data/Books.xml");
   XElement xe = XElement.Load(xmlFilePath);
   ///查找被替换的元素
   IEnumerable<XElement> element = from e in xe.Elements("Book")
           where e.Attribute("ID").Value == "106"
           select e;
   ///替换为新元素,并保存
   if (element.Count() > 0)
   {
    XElement first = element.First();
    ///获取第一个属性
    XAttribute attribute = first.FirstAttribute;
    ///将属性转换为元素
    first.AddFirst(
     new XElement(attribute.Name,attribute.Value) ///添加元素ID
     );
    ///删除属性
    first.RemoveAttributes();
   }
   xe.Save(xmlFilePath);
   ///显示XML文件的内容
   Response.Write(xe);
   ///设置网页显示的形式为XML文件
   Response.ContentType = "text/xml";
   Response.End();
}

}

book.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<Books>
<Book ID="101">
    <No>00001</No>
    <Name>Book 0001</Name>
    <Price>100</Price>
    <Remark>This is a book 00001.</Remark>
</Book>
<Book ID="102">
    <No>00002</No>
    <Name>Book 0002</Name>
    <Price>200</Price>
    <Remark>This is a book 00002.</Remark>
</Book>
<Book>
    <ID>106</ID>
    <No>0006</No>
    <Name>Book 0006</Name>
    <Price>600</Price>
    <Remark>This is a book 0006.</Remark>
</Book>
</Books>