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相关操作的更多相关文章

  1. VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式

    [1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...

  2. XML相关操作

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...

  3. sql server中对xml进行操作

    一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和参数.为了更好地支持 XM ...

  4. XML相关知识全接触(一)

    XML文件格式已经出来很久了.他的风头如今在JSON.YAML等新兴文件格式的冲击下已经显的不那么强劲.但是XML仍然是当今世界上使用最广泛的文件格式.围绕着它也有一大堆的概念和知识点.所以我们还是很 ...

  5. JqGrid相关操作

    JqGrid相关操作 根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是:$("#grid_id").jqGrid(options);也就是通过选择符得到一个tab ...

  6. 利用JAVA API远程进行HDFS的相关操作

    学习HDFS有一段时间了,现在把自己总结的HDFS的相关操作代码展示给大家. 主要有HDFS的增删改查,文件的追加,windows本地文件的上传,hdfs文件的下载,文件重命名,创建目录,文件是否存在 ...

  7. XML相关知识

    XML的定义:  XML即可扩展标记语言标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等.如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用 ...

  8. DateTimeHelper【日期类型与字符串互转以及日期对比相关操作】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 实现日期和字符串之间的转换以及日期的相关操作: 1.日期格式的字符串输出为Date类型: 2.将Date类型以指定格式输出: 3.将 ...

  9. 关于C#资源文件的相关操作

    关于资源文件的相关操作. //1.比较常见的有获取资源文件对应的文件流,然后转换到相对应的文件 //比较典型的做法是通过代码程序集加载指定资源 //如下通过Assembly的静态方法GetExecut ...

随机推荐

  1. SpringBoot 集成ehcache

    1, 项目实在springboot 集成mybatis 的基础上的: https://www.cnblogs.com/pickKnow/p/11189729.html 2,pom 如下,有的不需要加, ...

  2. jsonp跨域的原理及实现

    1,什么是跨域? 跨域跨域,跨过域名,笼统来说就是一个域名区请求另外一个域名的数据,但实际上,不同端口.不同域名.不同协议上请求数据都会出现跨域问题.浏览器出于安全考虑会报出异常,拒绝访问. 2,js ...

  3. Ubuntu系统安装wxPython问题

    wxPython介绍 wxPython是Python语言的GUI工具包,作为Python的扩展模块实现,包装了wxWidgets.wxPython是跨平台的,开源的.详情 wxPython安装 (1) ...

  4. python文件封装成*.exe

    python文件封装成*.exe文件(单文件和多文件) 环境:win10 64位 python3.7 原文: https://www.cnblogs.com/jackzz/p/9431923.html ...

  5. .net core系统跨平台部署手册

    前言 .net core跨平台版本基于.net core 3.1 SDK开发,剥离原来的基于MS Office进行文档转换功能的模块,使用基于开源跨平台的LibreOffice进行文档转换的模块.以此 ...

  6. Bug2020011601,在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现

    在ssh项目的applicaitonContext.xml中,少了一个双引号,打包成功(没报错),项目运行才发现. 加上少的双引号,解决了.

  7. B【SDOI2008】Sandy的卡片

    时间限制 : 5000 MS   空间限制 : 128000 KB 问题描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片 ...

  8. Redis 笔记(一)——数据类型简介

    Redis 是一个 key-value 存储系统,但是它的 value 值不仅仅可以存储字符串,value 共有 五种 数据结构类型,具体如下: 数据结构类型 结构类型 结构存储的值 结构的读写能力 ...

  9. 测试老司机都在用的表白神器你会吗?-Fiddler之AutoResponse线上调试

    一.Fiddler在线调试功能和表白神器介绍 ​ 在以往的工作中,线上有bug,就需要把文件弄到本地来改,但经常会碰见本地环境又和线上不一样,导致调试困难,闭着眼睛改好之后传到线上去看对不对,不对的话 ...

  10. Ceph学习笔记(3)- Monitor

    Ceph学习笔记(3)- Monitor 前言: ​ Ceph将cluster map与placement rule合并为一张表称为crush map,作为集群表的一部分.由Monitor对集群表的副 ...