• C# XML文件操作


    C# XML文件操作

    运行环境:Window7 64bit,.NetFramework4.61,C# 6.0; 编者:乌龙哈里 2017-02-09


    参考


    章节

    • 创建
    • 读取
    • 修改
    • 添加
    • 删除
    • 带属性的xml

    正文

    一、创建

    1、using System.Xml.Linq
    2、XElement 类
    3、示例:

    string path = @"d: est est.xml";
    XElement xe = new XElement("students",
        new XElement("student",
            new XElement("code","0001"),
            new XElement("name","Tony"),
            new XElement("score",100),
            new XElement("nclass",1),
            new XElement("ngrade",1)
         ),
         new XElement("student",
            new XElement("code", "0002"),
            new XElement("name", "Mike"),
            new XElement("score", 88),
            new XElement("nclass", 1),
            new XElement("ngrade", 1)
         ),
        new XElement("student",
            new XElement("code", "0003"),
            new XElement("name", "John"),
            new XElement("score", 90),
            new XElement("nclass", 2),
            new XElement("ngrade", 2)
         ),
        new XElement("student",
            new XElement("code", "0004"),
            new XElement("name", "Joe"),
            new XElement("score", 100),
            new XElement("nclass", 3),
            new XElement("ngrade", 3)
         )
    );
    xe.Save(path);

    /*
    <?xml version="1.0" encoding="utf-8"?>
    <students>
      <student>
        <code>0001</code>
        <name>Tony</name>
        <score>100</score>
        <nclass>1</nclass>
        <ngrade>1</ngrade>
      </student>
      <student>
        <code>0002</code>
        <name>Mike</name>
        <score>88</score>
        <nclass>1</nclass>
        <ngrade>1</ngrade>
      </student>
      <student>
        <code>0003</code>
        <name>John</name>
        <score>90</score>
        <nclass>2</nclass>
        <ngrade>2</ngrade>
      </student>
      <student>
        <code>0004</code>
        <name>Joe</name>
        <score>100</score>
        <nclass>3</nclass>
        <ngrade>3</ngrade>
      </student>
    </students>
    */

    xml文件中第一句 <?xml version="1.0" encoding="utf-8"?> 是缺省加入的,如要更改需用到 XDocument 和 XDeclaration

    string path = @"d: est est.xml";
    XDocument doc = new XDocument(new XDeclaration("2.0", "utf-16", "yes"));
    doc.Add(new XElement("root"));
    doc.Save(path);
    /*
    <?xml version="1.0" encoding="utf-16" standalone="yes"?>
    <root />
    */

    出来的结果不知道为何version改不了。

    二、读取

    按上例,我们先弄一个数据结构:

    class Student
     {
         public string code;
         public string name;
         public int score;
         public int nclass;
         public int ngrade;
     }

    直接读取,xml 里面读取出来的全部都是 string 类型,注意转换成所需数据类型:

    string path = @"d: est est.xml";
    XElement xe = XElement.Load(path);
    List<Student> list = new List<Student>();
    foreach (var s in xe.Elements("student"))
    {
        list.Add(new Student
        {
            code=s.Element("code").Value,
            name=s.Element("name").Value,
            score=int.Parse(s.Element("score").Value),
            nclass=int.Parse(s.Element("nclass").Value),
            ngrade=int.Parse(s.Element("ngrade").Value)
        });
     }

    三、修改

    1、根据值来直接修改。用lambda表达式很容易就能做到。

    string path = @"d: est est.xml";
    XElement xe = XElement.Load(path);
    foreach(var a in xe.Elements("student"))
    {
        Console.WriteLine(a.Element("name").Value);
    }
    Console.WriteLine();
    //把name叫Tony的修改成Tom
    xe.Elements("student").Where(x => x.Element("name").Value == "Tony").First().Element("name").SetValue("Tom");
    foreach (var a in xe.Elements("student"))
    {
        Console.WriteLine(a.Element("name").Value);
    }

    /*
    Tony
    Mike
    John
    Joe
    Tom
    Mike
    John
    Joe
    */

    2、根据位置来修改。比如将第二项的 name 为 Mike 的 name 改成 Micheal :

    //修改第二项数据,索引从0开始,所以是 index 为 1
    xe.Elements("student").ElementAt(1).Element("name").SetValue("Micheal");

    /*
    Tony
    Mike
    John
    Joe
    Tony
    Micheal
    John
    Joe
    */

    四、添加

    1、添加整项数据:

    string path = @"d: est est.xml";
    XElement xe = XElement.Load(path);
    XElement t = new XElement("student",
             new XElement("code", "0005"),
             new XElement("name", "Petter"),
             new XElement("score", 98),
             new XElement("nclass", 1),
             new XElement("ngrade", 1)
    );
    //添加
    xe.Add(t);
    foreach (var a in xe.Elements("student"))
    {
        Console.WriteLine(a.Element("name").Value);
    }

    /*
    Tony
    Mike
    John
    Joe
    Petter
    */

    2、给数据添加新项。比如我想给数据2添加个 sex 项,如下:

    string path = @"d: est est.xml";
    XElement xe = XElement.Load(path);
    var x = xe.Elements("student").ElementAt(2);
    foreach(var a in x.Descendants()){Console.WriteLine(a);}
    Console.WriteLine();
    //为数据添加新项
    x.Add(new XElement("sex","male"));
    foreach (var a in x.Descendants()){Console.WriteLine(a);}

    /*
    <code>0003</code>
    <name>John</name>
    <score>90</score>
    <nclass>2</nclass>
    <ngrade>2</ngrade>
    <code>0003</code>
    <name>John</name>
    <score>90</score>
    <nclass>2</nclass>
    <ngrade>2</ngrade>
    <sex>male</sex>
    */

    3、如果我想把数据3
    <code>0003</code>
    <name>John</name>
    <score>90</score>
    <nclass>2</nclass>
    <ngrade>2</ngrade>

    中的 <score>90</score> 换成
    <score>
    <chinese>88</chinese>
    <math>99</math>
    </score>

    用 ReplaceWith(),当然啦,也可以用先删除再添加:

    XElement t = new XElement("score",
        new XElement("chinese",88),
        new XElement("math",99));
    //替换
    xe.Elements("student").ElementAt(2).Element("score").ReplaceWith(t);

    五、删除

    下面演示各种删除法,说白了就是如何操作 lambda 查询语句而已。

    string path = @"d: est est.xml";
    XElement xe = XElement.Load(path);
    Console.WriteLine("===初始===");
    foreach (var a in xe.Elements()) { Console.WriteLine(a.ToString()); }
    //删除 name 为 John 的整个数据项
    xe.Elements("student").Where(b=>b.Element("name").Value=="John").First().Remove();
    Console.WriteLine("===删除John后===");
    foreach (var a in xe.Elements()) { Console.WriteLine(a.ToString()); }
    //删除 index 为 1 的数据
    xe.Elements("student").ElementAt(1).Remove();
    Console.WriteLine("===删除index 1 后===");
    foreach (var a in xe.Elements()) { Console.WriteLine(a.ToString()); }
    //删除 name 为 Tony 的 score 项
    xe.Elements("student").Where(b => b.Element("name").Value == "Tony").First().Element("score").Remove();
    Console.WriteLine("===删除 Tony 的 score 项===");
    foreach (var a in xe.Elements()) { Console.WriteLine(a.ToString()); }

    六、带属性的xml

    比如这种:

    /*
    <book Type="必修课" ISBN="7-111-19149-2">
      <title>数据结构</title>
      <author>严蔚敏</author>
      <price>30.00</price>
    </book>
    */

    book 标记中的属性用 XAttribute 来定义:

    XElement xe = new XElement ( "bookstore",
        new XElement("book",
            new XAttribute("Type","必修课"),
            new XAttribute("ISBN","7-111-19149-2"),
            new XElement("title","数据结构"),
            new XElement("author","严蔚敏"),
            new XElement("price","30.00"))
    );

    下来的操作就和不带 attribute 的差不多,比如把 必修课 属性改成 选修课:

    xe.Elements().ElementAt(0).Attribute("Type").SetValue("选修课");

    正文完。

    题外话:这篇文章是我用自己定义的简单标记来书写的,包括程序的关键词染色,看来效果还成。

  • 相关阅读:
    [redis] redis在线系统热迁移的方案与记录
    [golang] go get无法安装官方软件包
    我有关编程语言的一点理解
    [nginx] nginx源码分析--健康检查模块锁分析
    [nginx] nginx的hash与bucket size分析
    [daily][linux] dmesg格式里的时间为什么不准
    [daily] 查看linux程序或操作的kernel内核调用栈
    [go] 像gdb一样使用dlv debug golang程序
    [tls][https][nginx] https的client session cache与session ticket机制分析
    [性能优化] CPU电源管理pstate cstate
  • 原文地址:https://www.cnblogs.com/leemano/p/6381699.html
Copyright © 2020-2023  润新知