c# xml文件新增同级节点_C#操作XML方法:新增、修改和删除节点与属性

一 前言

先来了解下操作XML所涉及到的几个类及之间的关系  如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家

* 1 XMLElement 主要是针对节点的一些属性进行操作

* 2 XMLDocument 主要是针对节点的CUID操作

* 3 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法

清楚了以上的关系在操作XML时会更清晰一点

二 具体操作

以下会对Xml的结点与属性做增 删 改 查的操作也满足了实际工作中的大部分情况

先构造一棵XML树如下,其中也涉及到了写入xml文档的操作

1 public void CreatXmlTree(string xmlPath)

2 {

3 XElement xElement = new XElement(

4 new XElement("BookStore",

5 new XElement("Book",

6 new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),

7 new XElement("Author", "Martin", new XAttribute("Name", "Martin")),

8 new XElement("Adress", "上海"),

9 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))

10 ),

11 new XElement("Book",

12 new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")),

13 new XElement("Author", "Mary", new XAttribute("Name", "Mary")),

14 new XElement("Adress", "北京"),

15 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))

16 )

17 )

18 );

19

20 //需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常

21 XmlWriterSettings settings = new XmlWriterSettings();

22 settings.Encoding = new UTF8Encoding(false);

23 settings.Indent = true;

24 XmlWriter xw = XmlWriter.Create(xmlPath,settings);

25 xElement.Save(xw);

26 //写入文件

27 xw.Flush();

28 xw.Close();

29 }

然后得到如下的XML树

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

2

3

4 C#入门

5 Martin

6 2013-10-11

7 上海

8 2013-10-11

9

10

11 WCF入门

12 Mary

13 北京

14 2013-10-11

15

16

以下操作都是对生成的XML树进行操作

2.1 新增节点与属性

新增节点NewBook并增加属性Name="WPF"

1 public void Create(string xmlPath)

2 {

3 XmlDocument xmlDoc = new XmlDocument();

4 xmlDoc.Load(xmlPath);

5

6 var root = xmlDoc.DocumentElement;//取到根结点

7 XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", "");

8 newNode.InnerText = "WPF";

9

10 //添加为根元素的第一层子结点

11 root.AppendChild(newNode);

12 xmlDoc.Save(xmlPath);

13 }

开篇有写操作xml节点属性主要用XmlElement对象所以取到结点后要转类型

1 //属性

2 public void CreateAttribute(string xmlPath)

3 {

4 XmlDocument xmlDoc = new XmlDocument();

5 xmlDoc.Load(xmlPath);

6 var root = xmlDoc.DocumentElement;//取到根结点

7 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

8 node.SetAttribute("Name", "WPF");

9 xmlDoc.Save(xmlPath);

10

11 }

效果如下

2.2 删除节点与属性

1 public void Delete(string xmlPath)

2 {

3 XmlDocument xmlDoc = new XmlDocument();

4 xmlDoc.Load(xmlPath);

5 var root = xmlDoc.DocumentElement;//取到根结点

6

7 var element = xmlDoc.SelectSingleNode("BookStore/NewBook");

8 root.RemoveChild(element);

9 xmlDoc.Save(xmlPath);

10 }

删除属性

1 public void DeleteAttribute(string xmlPath)

2 {

3 XmlDocument xmlDoc = new XmlDocument();

4 xmlDoc.Load(xmlPath);

5 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

6 //移除指定属性

7 node.RemoveAttribute("Name");

8 //移除当前节点所有属性,不包括默认属性

9 //node.RemoveAllAttributes();

10 xmlDoc.Save(xmlPath);

11 }

2.3 修改节点与属性

xml的节点默认是不允许修改的,本文也就不做处理了

修改属性代码如下

1 public void ModifyAttribute(string xmlPath)

2 {

3 XmlDocument xmlDoc = new XmlDocument();

4 xmlDoc.Load(xmlPath);

5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

6 element.SetAttribute("Name", "Zhang");

7 xmlDoc.Save(xmlPath);

8 }

效果如下

2.4 获取节点与属性

1 public void Select(string xmlPath)

2 {

3 XmlDocument xmlDoc = new XmlDocument();

4 xmlDoc.Load(xmlPath);

5 //取根结点

6 var root = xmlDoc.DocumentElement;//取到根结点

7 //取指定的单个结点

8 XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook");

9

10 //取指定的结点的集合

11 XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook");

12

13 //取到所有的xml结点

14 XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*");

15 }

属性

1 public void SelectAttribute(string xmlPath)

2 {

3 XmlDocument xmlDoc = new XmlDocument();

4 xmlDoc.Load(xmlPath);

5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");

6 string name = element.GetAttribute("Name");

7 Console.WriteLine(name);

8 }

三  linq to XML 操作

Linq to Xml 也没什么变化只操作对象改变了主要涉及的几个对象如下   注:我并没有用linq的语法去操作元素。

XDocument:用于创建一个XML实例文档

XElement:用于一些节点与节点属性的基本操作

以下是对Xml的 一些简单的操作

3.1 新增节点与属性

1 public void Create(string xmlPath)

2 {

3 XDocument xDoc = XDocument.Load(xmlPath);

4 XElement xElement = xDoc.Element("BookStore");

5 xElement.Add(new XElement("Test", new XAttribute("Name", "Zery")));

6 xDoc.Save(xmlPath);

7 }

属性

1 public void CreateAttribute(string xmlPath)

2 {

3 XDocument xDoc = XDocument.Load(xmlPath);

4 IEnumerable xElement = xDoc.Element("BookStore").Elements("Book");

5 foreach (var element in xElement)

6 {

7 element.SetAttributeValue("Name", "Zery");

8 }

9 xDoc.Save(xmlPath);

10 }

3.2 删除节点与属性

1 public void Delete(string xmlPath)

2 {

3 XDocument xDoc = XDocument.Load(xmlPath);

4 XElement element = (XElement)xDoc.Element("BookStore").Element("Book");

5 element.Remove();

6 xDoc.Save(xmlPath);

7 }

属性

1 public void DeleteAttribute(string xmlPath)

2 {

3 XDocument xDoc = XDocument.Load(xmlPath);

4 //不能跨级取节点

5 XElement element = xDoc.Element("BookStore").Element("Book").Element("Name");

6 element.Attribute("BookName").Remove();

7 xDoc.Save(xmlPath);

8 }

3.3 修改节点属性

节点.net没提供修改的方法本文也不做处理

修改属性与新增实质是同一个方法

1 public void ModifyAttribute(string xmlPath)

2 {

3 XDocument xDoc = XDocument.Load(xmlPath);

4 XElement element = xDoc.Element("BookStore").Element("Book");

5 element.SetAttributeValue("BookName","ZeryTest");

6 xDoc.Save(xmlPath);

7 }

四 总结

把文章写完时,又扫去了自己的一个盲区,虽然都是些简单的操作,但在实际的开中,又何尝不是由简单到复杂呢。我觉得身为程序员就应该遇到自己的盲区时,立马花时间去了解,不说要了解多深入,但至少基本的还是要知道,等到工作中真需时,只要稍微花点时间就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值