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文档,在文件流里面仔细总结。部分例子来源其他博客。

最新文章

  1. li进度条宽度和颜色按顺序显示的效果。
  2. 大熊君JavaScript插件化开发------(第一季)
  3. iOS学习23之事件处理
  4. Android Studio学习笔记
  5. CNN卷积神经网络在自然语言处理的应用
  6. thinkphp 模板替换
  7. 如何编写一个简单的makefile
  8. 使用OracleDBLink进行数据库之间对象的访问操作
  9. ConcurrentModificationException异常出现的原因
  10. vscode运行前端代码
  11. .net core使用Ku.Core.Extensions.Layui实现layui表单渲染
  12. 一个解释volatile关键字最好的例子
  13. Ubuntu16.04 导入tensorflow报错
  14. python note 16 re模块的使用
  15. 构造 this super
  16. Android和H5进行数据交互,Android获取H5Input框中的内容
  17. Codeforces 822E Liar dp + SA (看题解)
  18. EtherCAT 要点
  19. 【git 报错】Could not read from remote repository.Please make sure you have the correct access rights.
  20. [转] h5上传视频或文件编写

热门文章

  1. ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径
  2. Linux上的软件安装有哪些方式?
  3. 经验总结:超详细的 Linux C/C++ 学习路线!大厂面试指南
  4. 【学习笔记】CART算法
  5. python之xlrd和xlwt模块读写excel使用详解
  6. gitlab问题
  7. postman 参数传递
  8. Tcl编成第二天,set与unset
  9. JAVA中的==和queals()的区别
  10. PHP获取当天、本周、本月、本季度、本年度时间