C# XML文件操作

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


参考


章节

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

正文

一、创建

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

string path = @"d:\test\test.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:\test\test.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:\test\test.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:\test\test.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:\test\test.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:\test\test.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:\test\test.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("选修课");

正文完。

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

C# XML文件操作的更多相关文章

  1. 我来讲讲在c#中怎么进行xml文件操作吧,主要是讲解增删改查!

    我把我写的四种方法代码贴上来吧,照着写没啥问题. 注: <bookstore> <book> <Id>1</Id> <tate>2010-1 ...

  2. XML文件操作类--创建XML文件

    这个类是在微软XML操作类库上进行的封装,只是为了更加简单使用,包括XML类创建节点的示例. using System; using System.Collections; using System. ...

  3. PHP对XML文件操作之属性与方法讲解

    DOMDocument相关的内容. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definit ...

  4. 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

     数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...

  5. SpringBatch Sample (三)(XML文件操作)

    前篇关于Spring Batch的文章,讲述了Spring Batch 对CSV文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对XML文件的读写操作.实例流程是 ...

  6. XML文件操作之dom4j

    能够操作xml的api还是挺多的,DOM也是可以的,不过在此记录下dom4j的使用,感觉确实挺方便的 所需jar包官网地址:http://www.dom4j.org/dom4j-1.6.1/ dom4 ...

  7. C#XML文件操作随笔

    以为公司一直没有电源屏厂家协议解析为DevVars相关的软件,手写费时费力还容易出错,用了2天时间做了一个.txt协议文件筛选加并解析成xml文件的工具,总结一下用到的几个知识点 1.LINQ 是一个 ...

  8. Xml文件操作的其中一个使用方法:

    XmlNodeList students = doc.DocumentElement.ChildNodes;//Student节点集合 foreach (XmlNode stu in students ...

  9. XML文件操作(C#)

    XML应用于Web开发的许多方面,常用于简化数据的存储和共享,它的设计宗旨是传输数据,而非显示数据.下面简单介绍一下C#是如何对XML文件进行读取的. 1.首先,建立XML对象并关联XML文件 str ...

随机推荐

  1. vs2013出现错误提示error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s

    这个问题是vs准备弃用strcpy带来的,因为觉得他不太安全 可以尝试在main函数前面加上#pragma warning(disable:4996)即可解决这个问题

  2. Java中的深拷贝(深复制)和浅拷贝(浅复制)

    深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复 ...

  3. CSS样式:覆盖规则

    规则一:由于继承而发生样式冲突时,最近祖先获胜. CSS的继承机制使得元素可以从包含它的祖先元素中继承样式,考虑下面这种情况: <html> <head> <title& ...

  4. 程序员们,AI来了,机会来了,危机也来了

    程序员们,AI来了,机会来了,危机也来了 1.人工智能真的来了 纵观古今,很少有计算机技术能有较长的发展寿命,大部分昙花一现,比如:昔日的DOS.windows3.2.foxpro.delphi.80 ...

  5. 手把手教你怎么用ArcgisOnline发布地图服务

    Arcgis推出了Arcgis Online,但是大家都不知道这是个什么东西,怎么用这个东西,今天这篇文章手把手的教你如何使用Arcgisonline发布地图服务. 一.ArcgisOnline简介 ...

  6. spring源码学习之:项目公共配置项解决方案

    一:项目中有一些key,value的简单配置 org.apache.commons.configuration.DatabaseConfiguration可以轻松解决 二:配置项目的xml中bean ...

  7. 洛谷 P1930 亚瑟王的宫殿 Camelot

    传送门 题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小. 题解:bfs+枚举 王的人生: 1):自己走到聚集点 2):某个骑士来到王这里,两个棋子一起到聚集点 3):王走几 ...

  8. 关于Apache Phoenix和Cloudera结合

    1. 安装: phoenix的官网最新版4.13.2是有parcle版本的,并不需要从cloudera的labs(实验室)中下载.安装完成后,可以运行一下phoenix的shell来简单验证一下:/o ...

  9. PHP 页面编码声明方法详解(header或meta)(转)

    编码格式有两种,一种是php文件本身的编码格式,如 editplus之类的编辑器在保存文件的时候允许你指定文件编码格式:另一种是php输出的文本的编码格式,这个信息只对浏览器生效,方法为<?ph ...

  10. aspupload ,在winows server 2008 下无法使用

    aspupload ,在winows server 2008 下无法使用.求助解决办法 2014-01-12 13:31 goolean | 浏览 775 次 操作系统 aspupload64位,安装 ...