C# XML相关操作
XML是一种意见单文本格式存储数据的方式,这意味着它可以被任何计算机读取。XML中完整的数据集就是XML文档。
在名称空间System.Xml下面大部分类型都是用来支持DOM处理模型的。其中很多类型配合起来共同组织成XMLDOM,XMLDOM是一种很典型的文档对象模型的应用。文档对象模型是一种比较高级的软件设计模式,我会在今后的课程中详细介绍文档对象模型这种软件设计模式。
| 类名 | 说明 |
| XmlNode | 这个类表示文档的一个节点,它是许多类的基类。如果这个节点表示XML文档的根,就可以从它导航文档任意位置。 |
| XmlDocument | 扩展了XmlNode类,但通常是使用XML的第一个对象,因为这个类用于加载磁盘或其他地方的数据,并在这些位置保存数据 |
| XmlElement | 表示XML文档的一个元素。它派生于XmlLinkedNode,XmlLinkedNode派生于XmlNode |
| XmlAttribute | 表示一个特性,与XmlDocument类一样,它也派生于XmlNode类 |
| XmlText | 表示开始标记于结束标记之间的文本 |
| XmlComment | 表示一种特殊的类型的节点,这种节点不是文档的一部分,但位阅读器提供文档各部分信息 |
| XmlNodeList | 表示一个节点的集合 |
创建一个XML文档
XmlDocument xmlDoc = new XmlDocument();
////创建Xml声明部分,即<?xml version="1.0" encoding="utf-8" ?>
XmlDeclaration Declaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(Declaration);
////创建根节点
XmlNode rootNode = xmlDoc.CreateElement("root");
////创建student子节点
XmlNode testPointNode = xmlDoc.CreateElement("testPoint");
创建一个属性
XmlAttribute testPointID = xmlDoc.CreateAttribute("TestPointID");
testPointID.Value = "1";
XmlAttribute caseID = xmlDoc.CreateAttribute("CaseId");
caseID.Value = "TEST_0001";
XmlAttribute name = xmlDoc.CreateAttribute("Name");
name.Value = "111";
////xml节点附件属性
testPointNode.Attributes.Append(testPointID);
testPointNode.Attributes.Append(caseID);
testPointNode.Attributes.Append(name);
rootNode.AppendChild(testPointNode);
////附加根节点
xmlDoc.AppendChild(rootNode);
////保存Xml文档
xmlDoc.Save(@"d:\testPoint.xml");
结果:
<?xml version="1.0" encoding="utf-8"?>
<root>
<testPoint TestPointID="1" CaseId="TEST_0001" Name="111" />
</root>
另外一种方法:
XmlDocument doc = new XmlDocument();
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "GB2312", null);
doc.AppendChild(dec);
//创建一个根节点(一级)
XmlElement root = doc.CreateElement("First");
doc.AppendChild(root);
//创建节点(二级)
XmlNode node = doc.CreateElement("Seconde");
root.AppendChild(node);
//创建节点(三级)
XmlElement element1 = doc.CreateElement("Third1");
element1.SetAttribute("Name", "Sam");
element1.SetAttribute("ID", "665");
element1.InnerText = "Sam Comment";
node.AppendChild(element1);
doc.Save(@"d:\bb.xml");
结果:
<?xml version="1.0" encoding="GB2312"?>
<First>
<Seconde>
<Third1 Name="Sam" ID="665">Sam Comment</Third1>
</Seconde>
</First>
注意:在这里面 XmlNode和XmlElement可以互换,其结果不变。但这两者之间有区别,需要规范操作。
Element是Node的扩展,所以也更实用一些。例如,用Element可以方便的获得Node的属性getAttribute(String attrName)如果用Node,可以得到一个属性集,还要进一步检索才可得到想要的属性。一个结点不一定是一个元素,而一个元素一定是一个结点。 Element是Node的子集,XmlNode表示一个节点,包括XmlElement(元素)和XmlAttribute(属性)等。
又一种方法:(对应结果查看之间关系)
XmlTextWriter 表示提供快速、非缓存、只进方法的编写器,该方法生成包含 XML 数据(这些数据符合 W3C 可扩展标记语言 (XML) 1.0 和“XML 中的命名空间”建议)的流或文件。
XmlTextWriter xmlWriter;
string strFilename = @"d:\55555555555555.xml";
xmlWriter = new XmlTextWriter(strFilename, Encoding.Default);//创建一个xml文档
xmlWriter.Formatting = Formatting.Indented;//输出格式设置
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("Employees");
xmlWriter.WriteStartElement("Node");
xmlWriter.WriteAttributeString("genre", "李赞红");
xmlWriter.WriteAttributeString("ISBN", "2-3631-4");
xmlWriter.WriteStartElement("title");
xmlWriter.WriteString("CS从入门到精通");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("author");
xmlWriter.WriteString("候捷");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("price");
xmlWriter.WriteString("58.3");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.Close();
结果:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
<Node genre="李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
</Node>
</Employees>
创建xml文档的方法,多种多样,可以根据XML不同的类和方法来创建。
XML添加
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"d:\55555555555555.xml");
XmlNode root = xmlDoc.SelectSingleNode("Employees");//查找<Employees>
XmlElement xe1 = xmlDoc.CreateElement("Node");//创建一个<Node>节点
xe1.SetAttribute("genre", "张三");//设置该节点genre属性
xe1.SetAttribute("ISBN", "1-1111-1");//设置该节点ISBN属性
XmlElement xesub1 = xmlDoc.CreateElement("title");
xesub1.InnerText = "C#入门帮助";//设置文本节点
xe1.AppendChild(xesub1);//添加到<Node>节点中
XmlElement xesub2 = xmlDoc.CreateElement("author");
xesub2.InnerText = "高手";
xe1.AppendChild(xesub2);
XmlElement xesub3 = xmlDoc.CreateElement("price");
xesub3.InnerText = "158.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<Employees>节点中
xmlDoc.Save(@"d:\55555555555555.xml");
另一种方法:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"d:\55555555555555.xml");
XmlNode root = xmlDoc.SelectSingleNode("Employees");//查找<Employees>
XmlElement xe1 = xmlDoc.CreateElement("Node");//创建一个<Node>节点
xe1.SetAttribute("genre", "张三");//设置该节点genre属性
xe1.SetAttribute("ISBN", "1-1111-1");//设置该节点ISBN属性
//创建三个节点
XmlElement xesub1 = xmlDoc.CreateElement("title");
XmlElement xesub2 = xmlDoc.CreateElement("author");
XmlElement xesub3 = xmlDoc.CreateElement("price");
//在对应三个节点里加内容
XmlText title = xmlDoc.CreateTextNode("C#入门帮助");
XmlText author = xmlDoc.CreateTextNode("高手");
XmlText price = xmlDoc.CreateTextNode("158.3");
xesub1.AppendChild(title);
xesub2.AppendChild(author);
xesub3.AppendChild(price);
xe1.AppendChild(xesub1);
xe1.AppendChild(xesub2);
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<Employees>节点中
xmlDoc.Save(@"d:\55555555555555.xml");
结果:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
<Node genre="李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
</Node>
<Node genre="张三" ISBN="1-1111-1">
<title>C#入门帮助</title>
<author>高手</author>
<price>158.3</price>
</Node>
</Employees>
XML修改节点的值
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"d:\55555555555555.xml");
XmlNodeList nodeList = xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点
foreach (XmlNode xn in nodeList)//遍历所有子节点
{
XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
if (xe.GetAttribute("genre") == "张三")//如果genre属性值为“张三”
{
xe.SetAttribute("genre", "update张三");//则修改该属性为“update张三”
XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点
foreach (XmlNode xn1 in nls)//遍历
{
XmlElement xe2 = (XmlElement)xn1;//转换类型
if (xe2.Name == "author")//如果找到
{
xe2.InnerText = "亚胜";//则修改
}
}
}
}
xmlDoc.Save(@"d:\55555555555555.xml");
}
}
结果为:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
<Node genre="李赞红" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
</Node>
<Node genre="update张三" ISBN="1-1111-1">
<title>C#入门帮助</title>
<author>亚胜</author>
<price>158.3</price>
</Node>
</Employees>
//(添加结点的属性和添加结点的自结点):
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"d:\55555555555555.xml");
XmlNodeList nodeList = xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
xe.SetAttribute("test", "111111");//添加属性
XmlElement xesub = xmlDoc.CreateElement("flag");//添加一个节点
xesub.InnerText = "1";
xe.AppendChild(xesub);
}
xmlDoc.Save(@"d:\55555555555555.xml");
}
结果为:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
<Node genre="李赞红" ISBN="2-3631-4" test="111111">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
<flag>1</flag>
</Node>
<Node genre="update张三" ISBN="1-1111-1" test="111111">
<title>C#入门帮助</title>
<author>亚胜</author>
<price>158.3</price>
<flag>1</flag>
</Node>
</Employees>
删除节点
删除节点的某一个属性或某个子节点。
将上面紫色部分改为如下即可:
xe.RemoveAttribute("genre");//删除genre属性
xe.RemoveChild(xe2);//则删除子节点
结果:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
<Node ISBN="2-3631-4">
<title>CS从入门到精通</title>
<price>58.3</price>
</Node>
<Node ISBN="1-1111-1">
<title>C#入门帮助</title>
<price>158.3</price>
</Node>
</Employees>
删除一个节点所有内容
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"d:\55555555555555.xml");
XmlElement root=xmlDoc.DocumentElement;//获取根节点
XmlNodeList nodeList = xmlDoc.SelectSingleNode("Employees").ChildNodes;//获取Employees节点的所有子节点
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("genre") == "update张三")//
{
root.RemoveChild(xe);
}
}
xmlDoc.Save(@"d:\55555555555555.xml");
}
结果:
<?xml version="1.0" encoding="gb2312"?>
<Employees>
<Node genre="李赞红" ISBN="2-3631-4" test="111111">
<title>CS从入门到精通</title>
<author>候捷</author>
<price>58.3</price>
<flag>1</flag>
</Node>
</Employees>
至于读取xml文档,在文件流里面仔细总结。部分例子来源其他博客。
C# XML相关操作的更多相关文章
- VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
[1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...
- XML相关操作
一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...
- sql server中对xml进行操作
一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...
- XML相关知识全接触(一)
XML文件格式已经出来很久了.他的风头如今在JSON.YAML等新兴文件格式的冲击下已经显的不那么强劲.但是XML仍然是当今世界上使用最广泛的文件格式.围绕着它也有一大堆的概念和知识点.所以我们还是很 ...
- JqGrid相关操作
JqGrid相关操作 根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是:$("#grid_id").jqGrid(options);也就是通过选择符得到一个tab ...
- 利用JAVA API远程进行HDFS的相关操作
学习HDFS有一段时间了,现在把自己总结的HDFS的相关操作代码展示给大家. 主要有HDFS的增删改查,文件的追加,windows本地文件的上传,hdfs文件的下载,文件重命名,创建目录,文件是否存在 ...
- XML相关知识
XML的定义: XML即可扩展标记语言标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等.如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用 ...
- DateTimeHelper【日期类型与字符串互转以及日期对比相关操作】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 实现日期和字符串之间的转换以及日期的相关操作: 1.日期格式的字符串输出为Date类型: 2.将Date类型以指定格式输出: 3.将 ...
- 关于C#资源文件的相关操作
关于资源文件的相关操作. //1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 //比较典型的做法是通过代码程序集加载指定资源 //如下通过Assembly的静态方法GetExecut ...
随机推荐
- Transformers 简介(下)
作者|huggingface 编译|VK 来源|Github Transformers是TensorFlow 2.0和PyTorch的最新自然语言处理库 Transformers(以前称为pytorc ...
- 十分钟一起学会Inception网络
作者 | 荔枝boy 编辑 | 安可 一.Inception网络简介 二.Inception网络模块 三.Inception网络降低参数计算量 四.Inception网络减缓梯度消失现象 五.Ince ...
- PHP7内核(五):系统分析生命周期
上篇文章讲述了模块初始化阶段之前的准备工作,本篇我来详细介绍PHP生命周期的五个阶段. 一.模块初始化阶段 我们先来看一下该阶段的每个函数的作用. 1.1.sapi_initialize_reques ...
- Binder驱动理解
1.Binder的三层架构 2.BC.BR的理解 通信模型 Binder协议包含在IPC数据中,分为两类: BINDER_COMMAND_PROTOCOL:binder请求码,以"BC_&q ...
- mongodb的更新语句
MongoDB 使用 update() 和 save() 方法来更新集合中的文档: update()方法: update() 方法用于更新已存在的文档.语法格式如下: db.collection.up ...
- 轻轻松松了解Java的初始化方法(含对象数组的小问题)
Java基础复习6-初始化 之前讲过了类的一些基础,想必大家都知道了类的定义 什么?你忘了? 下面给你一个例子快速复习 class AClass{ int a; boolean b; void get ...
- webpack篇
2017年09月28日 14:08:18 阅读数:4770 https://juejin.im/post/59cb6307f265da064e1f65b9 还是以前一样,有些概念面试可能会考,我都用* ...
- Java代理笔记
代理顾名思义,就是一个中间层,当我们要使用某个方法时,不直接调用,而是告诉代理,让代理替我们去请求方法,并返回结果.在这个过程中,我们只知道代理执行并返回给了我们操作结果,至于它有没有其他操作并不知道 ...
- Iscsi技术
Iscsi技术 1案例1:发布iSCSI网络磁盘 1.1问题 本 ...
- zabbix模板的自动发现规则(ldd)实现被监控项自动发现
zabbix模板的自动发现规则(ldd)实现被监控项自动发现 自动发现规则(ldd)用途说明 在zabbix自带的linux模板的自动发现规则中,有一个Mounted filesystem disco ...