天天看点

165.C# LINQ TO XML

作者:数字双碳王亮

摘要

在使用LINQ to XML时需要添加System.Xml.Linq.dll的引用。

  • XElement类 表示XML元素,它是XContainer类的派生类,而XContainer类又派生于XNode类。一个元素就是一个节点。
  • XElement是LINQ to XML最重要最基本的类之一,它包含所有创建和操作XML元素所必需的功能。通过它可以创建元素,添加和修改元素的属性,操作元素的内容等。
  • XAttribute类 用来处理属性,属性是与元素相关联的名称/值对。
  • XDocument类 提供了处理有效XML文档的方法,包括声明、注释和处理指令。XDocument类派生自XContainer类,可以有子节点。XML标准限值XDocument对象只包含单个XElement子节点,此节点作为根节点或跟元素。

正文

创建一个XML

private void btnCreateXml_Click(object sender, EventArgs e)
{
    XElement xml = new XElement("Persons");
    xml.Add(new XElement("Person"
       , new XElement("Name", "刘备")
       , new XElement("Age", "40")));
    xml.Add(new XElement("Person"
      , new XElement("Name", "关羽")
      , new XElement("Age", "35")));
    xml.Add(new XElement("Person"
      , new XElement("Name", "张飞")
      , new XElement("Age", "32")));
    xml.Save("./1.xml");
}           

采用Ling生成xml

XElement xml = new XElement("Heros",
    from hero in heroes
    select new XElement("hero",
        new XAttribute("Name", hero.Name),
        new XAttribute("Age", hero.Age)
));
xml.Save("./hero.xml");           

生成的xml

<?xml version="1.0" encoding="utf-8"?>
<Heros>
  <hero Name="张飞" Age="38" />
  <hero Name="刘备" Age="40" />
  <hero Name="关羽" Age="39" />
  <hero Name="曹操" Age="45" />
  <hero Name="孙权" Age="31" />
</Heros>           

遍历

private void btnView_Click(object sender, EventArgs e)
{
    XDocument xdoc=new XDocument();
    xdoc = XDocument.Parse(File.ReadAllText("./1.xml"));

    var ret = xdoc.Element("Persons").Descendants();
    foreach (var item in ret)
    {
        lstXml.Items.Add(item.Name+" "+item.Value);
    }
}           
165.C# LINQ TO XML

添加一个节点

private void btnAdd_Click(object sender, EventArgs e)
{
    XDocument xdoc = new XDocument();
    xdoc = XDocument.Parse(File.ReadAllText("./1.xml"));

    xdoc.Element("Persons").Add(new XElement("Person"
        ,new XElement("Name","曹操")
        , new XElement("Age", 50)
        ));

    var ret = xdoc.Element("Persons").Descendants();
    foreach (var item in ret)
    {
        lstXml.Items.Add(item.Name + " " + item.Value);
    }
}           
165.C# LINQ TO XML

删除一个节点

private void btnDelete_Click(object sender, EventArgs e)
{
    var elements = from x in xml.Elements("Person")
                           where x.Element("Name").Value=="张飞"
                           select x;
    elements.First().Remove();

    var ret = from x in xml.Elements("Person")
              select x;

    foreach (var item in ret)
    {
        lstXml.Items.Add(item.Name + " " + item.Value);
    }

}           
165.C# LINQ TO XML