C#操作XML方法集合

时间:2021-12-26 17:49:23

 

一 前言

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

* 1 XMLElement 主要是针对节点的一些属性进行操作
* 2 XMLDocument 主要是针对节点的CUID操作
* 3 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法

 

 

C#操作XML方法集合

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

 

二 具体操作(C#)

  以下会对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 <BookStore>
3 <Book>
4 <Name BookName="C#">C#入门</Name>
5 <Author Name="Martin">Martin</Author>
6 <Date>2013-10-11</Date>
7 <Adress>上海</Adress>
8 <Date>2013-10-11</Date>
9 </Book>
10 <Book>
11 <Name BookName="WCF">WCF入门</Name>
12 <Author Name="Mary">Mary</Author>
13 <Adress>北京</Adress>
14 <Date>2013-10-11</Date>
15 </Book>
16 </BookStore>

 

以下操作都是对生成的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 }

 

 效果如下

C#操作XML方法集合

 

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 }

效果如下

C#操作XML方法集合

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> 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 }

 

 四 总结

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

如果觉得文章对你有点帮助,不妨点下推荐,你的推荐让我对写文章能有更多的激情!

成长在于积累!

 

Demo 源码

C#操作XML方法集合C#操作XML方法集合
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Web;
using System.Xml.Linq;

namespace XMLOperation
{
class Program
{
static void Main(string[] args)
{
/*=============Linq 读写XML==================*/
string wxmlPath = @"F:\XmlTest\test.xml";
XmlWriteReadLinqOperation writeReadLinq
= new XmlWriteReadLinqOperation();
// writeReadLinq.WriteXml(wxmlPath);
writeReadLinq.CreatXmlTree(wxmlPath);




//string xmlPath = @"F:\XML.xml";
string xmlPath = @"C:\Users\zery.zhang\Desktop\ProjectDemo\XML.xml";
/*
* 1 三者之间的关系用图画出
* 2 XMLElement 主要是针对节点的一些属性进行操作
* 3 XMLDocument 主要是针对节点的CUID操作
* 4 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法
*/

//===========C# to Xml==========//
XmlOperation xmlOperation = new XmlOperation();
//xmlOperation.Create(xmlPath);
//xmlOperation.CreateAttribute(xmlPath);

//xmlOperation.Delete(xmlPath);
//xmlOperation.DeleteAttribute(xmlPath);

//xmlOperation.Modify(xmlPath);
//xmlOperation.ModifyAttribute(xmlPath);

//xmlOperation.Select(xmlPath);
//xmlOperation.SelectAttribute(xmlPath);
/*=============Linq to Xml===========*/
XmlOperationToLinq xOperation
= new XmlOperationToLinq();
// xOperation.Create(xmlPath);
/*
*1 给指定的XML节点的所有子节点增加一个节点,并增加属性
*2 删除指定节点的子节点的指定属性
*3
*/
string lxmlPath = @"F:\XmlTest\test.xml";
xOperation.Create(lxmlPath);
xOperation.CreateAttribute(lxmlPath);
//xperation.Delete(lxmlPath);
//xOperation.DeleteAttribute(lxmlPath);
// xOperation.ModifyAttribute(lxmlPath);

/*=============C# 读写XML===============*/
XmlWriteReadOperation writeRead
= new XmlWriteReadOperation();


Console.Read();

}

}

class XmlOperation
{

public void Create(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
var root = xmlDoc.DocumentElement;//取到根结点

XmlNode newNode
= xmlDoc.CreateNode("element", "Name", "");
newNode.InnerText
= "Zery";

//添加为根元素的第一层子结点
root.AppendChild(newNode);
xmlDoc.Save(xmlPath);
}
//属性
public void CreateAttribute(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
XmlElement node
= (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");
node.SetAttribute(
"Name", "C#");
xmlDoc.Save(xmlPath);
}

public void Delete(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
var root = xmlDoc.DocumentElement;//取到根结点

var element = xmlDoc.SelectSingleNode("Collection/Name");
root.RemoveChild(element);
xmlDoc.Save(xmlPath);
}

public void DeleteAttribute(string xmlPath)
{

XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
XmlElement node
= (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");
//移除指定属性
node.RemoveAttribute("Name");
//移除当前节点所有属性,不包括默认属性
node.RemoveAllAttributes();

xmlDoc.Save(xmlPath);

}

public void Modify(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
var root = xmlDoc.DocumentElement;//取到根结点
XmlNodeList nodeList = xmlDoc.SelectNodes("/Collection/Book");
//xml不能直接更改结点名称,只能复制然后替换,再删除原来的结点
foreach (XmlNode node in nodeList)
{
var xmlNode = (XmlElement)node;
xmlNode.SetAttribute(
"ISBN", "Zery");
}
xmlDoc.Save(xmlPath);

}

public void ModifyAttribute(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
XmlElement element
= (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");
element.SetAttribute(
"Name", "Zhang");
xmlDoc.Save(xmlPath);

}

public void Select(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
//取根结点
var root = xmlDoc.DocumentElement;//取到根结点
//取指定的单个结点
XmlNode singleNode = xmlDoc.SelectSingleNode("Collection/Book");

//取指定的结点的集合
XmlNodeList nodes = xmlDoc.SelectNodes("Collection/Book");

//取到所有的xml结点
XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*");
}

public void SelectAttribute(string xmlPath)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(xmlPath);
XmlElement element
= (XmlElement)xmlDoc.SelectSingleNode("Collection/Book");
string name = element.GetAttribute("Name");

}
}

class XmlOperationToLinq
{
//其它操作
public void OtherOperaton()
{
//加文件头
}



public void Create(string xmlPath)
{
XDocument xDoc
= XDocument.Load(xmlPath);
XElement xElement
= xDoc.Element("BookStore");
xElement.Add(
new XElement("Test", new XAttribute("Name", "Zery")));
xDoc.Save(xmlPath);
}

public void CreateAttribute(string xmlPath)
{
XDocument xDoc
= XDocument.Load(xmlPath);
IEnumerable
<XElement> xElement = xDoc.Element("BookStore").Elements("Book");
foreach (var element in xElement)
{
element.SetAttributeValue(
"Name", "Zery");
}
xDoc.Save(xmlPath);
}

public void Delete(string xmlPath)
{
XDocument xDoc
= XDocument.Load(xmlPath);
XElement element
= (XElement)xDoc.Element("BookStore").Element("Book");
element.Remove();
xDoc.Save(xmlPath);
}

public void DeleteAttribute(string xmlPath)
{
XDocument xDoc
= XDocument.Load(xmlPath);
//不能跨级取节点
XElement element = xDoc.Element("BookStore").Element("Book").Element("Name");
element.Attribute(
"BookName").Remove();
xDoc.Save(xmlPath);
}

public void ModifyAttribute(string xmlPath)
{
XDocument xDoc
= XDocument.Load(xmlPath);
XElement element
= xDoc.Element("BookStore").Element("Book");
element.SetAttributeValue(
"BookName","ZeryTest");
xDoc.Save(xmlPath);
}


}

internal class XmlWriteReadOperation
{

}


class XmlWriteReadLinqOperation
{


public void CreatXmlTree(string xmlPath)
{
XElement xElement
= new XElement(
new XElement("BookStore",
new XElement("Book",
new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),
new XElement("Author", "Martin", new XAttribute("Name", "Martin")),
new XElement("Adress", "上海"),
new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))
),
new XElement("Book",
new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")),
new XElement("Author", "Mary", new XAttribute("Name", "Mary")),
new XElement("Adress", "北京"),
new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))
)
)
);

//需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding
= new UTF8Encoding(false);
settings.Indent
= true;
XmlWriter xw
= XmlWriter.Create(xmlPath,settings);
xElement.Save(xw);
//写入文件
xw.Flush();
xw.Close();
}




public void WriteXml(string xmlPath)
{
XElement xElement
= new XElement(
new XElement("Store",
new XElement("Book", "技术类",
new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),
new XElement("Author", "Martin", new XAttribute("Name", "Zery")),
new XComment("以下为注释"),//xml注释
new XElement("Date", DateTime.Now.ToString(), new XAttribute("PublicDate", DateTime.Now.ToString()))
))
);

XmlWriter xw
= XmlWriter.Create(xmlPath);
//保存到XmlWriter
xElement.Save(xw);
//写入文件
xw.Flush();
xw.Close();

}


}
}
View Code