C#基础知识-XML介绍及基本操作(十)
在讲了一系列的基础文档之后,现在开始讲一些实例。对于一些数据不是很大的程序,或者只是一些配置文件,需要本地存储的,完全可以使用XML代替数据库,因为只是去操作单个文件会比操作数据库要简单很多,在程序中访问和操作XML一般使用DOM(文档对象模型)和流模式。DOM运行编辑和更新XML文档,可以随机访问文档中的数据,但有一个缺点,就是在加载XML的时候是会吧整个文档的加载进内存中。流模式很好的解决了这个问题,在对XML文件访问采用的是流的概念,任何时候在内存中只有当前接口,不足的地方是它是只读的,仅向前,不能再文档中去向后编辑增加。
XML(Extensible Markup Language)可扩展的标记语言,XML和HTML有很多地方都非常的类似,但HTML的语法不够严密,很松散,很多的格式没有强制的要求所以尤其在处理浏览器兼容的问题上需要费很大的心思啊,我特别有体会,很多不同的网站系统对浏览器就有要求,标准不统一,所以电脑上谷歌、火狐、360…..一大堆的浏览器就是为了适应不同的网站兼容的问题,XML有着严格的格式要求,比如要求元素必须是一对对显示的,XML还有一个很重要的特性就是通用性高,很多的程序包括Web和App底层数据交换都是转换成XML来进行数据交换的。
下面来看一个简单的XML文档:
- <?xml version="1.0" encoding="utf-8" standalone=”yes”?>
- <!—下面是学生名单-->
- <学生名单>
- <学生 id=”1”>
- <学号>201701</学号>
- <姓名>张三三</姓名>
- <班级>0102</班级>
- </学生>
- <学生 id=”2”>
- <学号>201702</学号>
- <姓名>李四四</姓名>
- <班级>0102</班级>
- </学生>
- <学生 id=”3”>
- <学号>201703</学号>
- <姓名>王五五</姓名>
- <班级>0103</班级>
- </学生>
- </学生名单>
1.文档头部声明:
<?xml version="1.0" encoding="utf-8" ?>
?XML标记说明它是一个XML文档,version为版本号,encoding属性表明是编码格式为”utf-8”,standalone取”yes”时,表明该文件未引用其它外部文件。
2.注释:
<!--下面是学生名单-->
注释的格式和html类似:<!--“注释的内容”-->,使用注释时需要注意:1.注释不可以出现在XML声明之前.2.注释中不可以出现”--”字符,如:<!--下面是学生--名单> 3.注释不可以嵌套.
3.根元素:
<学生名单> XXX </学生名单>
每个文档必须有有一个根元素,没有根元素将会在解析的时候出现错误
4.元素(标记),是XML中用来定义数据的一个基本的单位,元素是由标记要定义的,同时标记分为非空标记和空标记:
(1)非空标记
<学号>201701</学号>
<姓名>张三三</姓名>
<班级>0102</班级>
非空即当标记中包含有内容,格式为:<标记>内容<标记>
(2)空标记
<学生 id=”1”></学生>
空标记中只有属性,两个标签中的内容是为空的。
XML位于System.Xml命名空间,以下为XML结构列表:
标 记 |
描 述 |
XmlDocument |
XML文档 |
XmlNode |
XML中单个的节点,如<学生名单> |
XmlAttribute |
XML元素中的属性 |
XmlText |
表示元素或属性的文本内容 |
XmlElement |
最小元素,如<姓名>张三三</姓名> |
XmlComment |
表示XML注释的内容 |
XmlDeclaration |
XML文档第一行的声明 |
XML文档的创建
最终效果:
<?xml version="1.0" encoding="UTF-8"?>
<学生名单>
<学生 id="1">
<姓名>张三三</姓名>
</学生>
</学生名单>
代码:
- //创建一个XML文档对象
- XmlDocument doc = new XmlDocument();
- //声明XML头部信息
- XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
- //添加进doc对象子节点
- doc.AppendChild(dec);
- //创建根节点
- XmlElement root = doc.CreateElement("学生名单");
- doc.AppendChild(root);
- //再创建根节点下的子节点
- XmlElement student = doc.CreateElement("学生");
- //设置子节点属性
- student.SetAttribute("id", "");
- //子节点下再创建标记
- XmlElement studentName = doc.CreateElement("姓名");
- //<姓名>的内容
- XmlText xmlText = doc.CreateTextNode("张三三");
- //将内容添加到<姓名>标记
- studentName.AppendChild(xmlText);
- //再将<姓名>标记添加到<学生>标记的子节点下
- student.AppendChild(studentName);
- //最后把<学生>标记添加到根节点<学生名单>子节点下
- root.AppendChild(student);
- //doc文档对象保存写入
- doc.Save("Student.xml");
XML文档的读取
C#中XML读取有三种方式,XmlDocument,XmlTextReader,Linq to Xml,这几种方式中我个人习惯是用Linq,因为Linq去读取、筛选都会很方便,但是由于还没有写关于Linq的文章,这里我们使用XmlDocument的方式。
- XmlDocument doc = new XmlDocument();
- //加载根目录下XML文件
- doc.Load("XMLFile1.xml");
- //获取根节点
- XmlElement root = doc.DocumentElement;
- //获取<学生>子节点
- XmlNodeList personNodes = root.GetElementsByTagName("学生");
- //使用foreach循环读出集合
- foreach (XmlNode node in personNodes)
- {
- string id = ((XmlElement)node).GetAttribute("id");
- string name = ((XmlElement)node).GetElementsByTagName("姓名")[].InnerText;
- string number = ((XmlElement)node).GetElementsByTagName("学号")[].InnerText;
- string _class = ((XmlElement)node).GetElementsByTagName("班级")[].InnerText;
- Console.WriteLine("学生Id:{0},姓名:{1},学号:{2},班级:{3}", id, name, number, _class);
- }
- Console.ReadKey();
增加
- string xmlPath = "XMLFile1.xml";
- XmlDocument doc = new XmlDocument();
- //加载根目录下XML文件
- doc.Load(xmlPath);
- //获取根节点
- XmlElement root = doc.DocumentElement;
- XmlElement student = doc.CreateElement("学生");
- student.SetAttribute("id", "");
- //添加姓名标记
- XmlElement studentName = doc.CreateElement("姓名");
- XmlText xmlText = doc.CreateTextNode("小明");
- studentName.AppendChild(xmlText);
- //添加学号标记
- XmlElement studentNumber = doc.CreateElement("学号");
- XmlText xmlText2 = doc.CreateTextNode("");
- studentNumber.AppendChild(xmlText2);
- //添加班级标记
- XmlElement studentClass = doc.CreateElement("班级");
- XmlText xmlText3 = doc.CreateTextNode("");
- studentClass.AppendChild(xmlText3);
- //将上面创建的标记添加到<学生>标记
- student.AppendChild(studentName);
- student.AppendChild(studentNumber);
- student.AppendChild(studentClass);
- //将上面创建的标记添加到<学生名单>根标记
- root.AppendChild(student);
- //最后一步不要忘记了保存
- doc.Save(xmlPath);
修改
- string xmlPath = "XMLFile1.xml";
- XmlDocument doc = new XmlDocument();
- doc.Load(xmlPath);
- XmlElement root = doc.DocumentElement;
- //筛选出符合条件的标记
- XmlElement selectEle = (XmlElement)root.SelectSingleNode("/学生名单/学生[@id='4']");
- //获取该标记下的子元素
- XmlElement nameEle = (XmlElement)selectEle.GetElementsByTagName("姓名")[];
- //修改<姓名>标记中的内容
- nameEle.InnerText = "大明";
- //还是那句话不要忘记保存
- doc.Save(xmlPath);
删除标记
删除和修改类似,也是筛选出符合条件的标记,然后移除
- string xmlPath = "XMLFile1.xml";
- XmlDocument doc = new XmlDocument();
- doc.Load(xmlPath);
- XmlElement root = doc.DocumentElement;
- //筛选出符合条件的标记
- XmlElement selectEle = (XmlElement)root.SelectSingleNode("/学生名单/学生[@id='4']");
- //删除指定子元素
- root.RemoveChild(selectEle);
- //还是那句话不要忘记保存
- doc.Save(xmlPath);
以上就是XML基本的操作方法,当然如果使用Linq to Xml的话会更加的灵活,其它的几种操作方法有兴趣的同学也可以直接研究。
C#基础知识-XML介绍及基本操作(十)的更多相关文章
- 什么是Shell?Shell脚本基础知识详细介绍
这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...
- python基础知识六 文件的基本操作+菜中菜
基础知识六 文件操作 open():打开 file:文件的位置(路径) mode:操作文件模式 encoding:文件编码方式 f :文件句柄 f = open("1.t ...
- Android中直播视频技术探究之---基础知识大纲介绍
一.前言 最近各种视频直播app到处都是,各种霸屏,当然我们也是需要体验的,关于视频直播的软件这里就不介绍了,在不是技术的人来看,直播是一种潮流,是一种娱乐方式,但是作为一个高技术的,我们除了看看,更 ...
- JAVA基础知识xml,date
虽然说看文档最好是看官方原来的文档,但是呢,下面是我看别的人的总结,算做抛砖引玉吧,如果有不对的,我会在后期给更正或者自己来写一篇 1,JAVA中对xml的操作,包括schema,dtd等相关知识:标 ...
- 浅谈:javascript的面向对象编程之基础知识的介绍
在进入javascript的面对对象之前,我们先来介绍一下javascript的几个概念. 1.javascript的面向对象的基本概念 function aa(){ } /* * 这里的aa,在我们 ...
- linux学习笔记:1.基础知识和命令行基本操作
初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...
- shell 脚本基础知识详细介绍(二)
SimonSu 博客 评论墙 读者墙 链接 关于 linux中的sh脚本语法 玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是 ...
- Shell脚本基础知识详细介绍(一)
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...
- 2-2 groovy基础知识-理论介绍
随机推荐
- 进程间通信系列 之 socket套接字及其实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- PHP array_filter() 函数
定义和用法 array_filter() 函数用回调函数过滤数组中的元素,如果自定义过滤函数返回 true,则被操作的数组的当前值就会被包含在返回的结果数组中, 并将结果组成一个新的数组.如果原数组是 ...
- 完美实现在同一个页面中使用不同样式的artDialog样式
偶然发现artDialog.js这个插件,就被其优雅的设计及漂亮的效果深深吸引,在做例子时碰到了一些想当然它应该提供但却没有提供的功能,不过这都不影响我对它的喜爱,下面说一下遇到的问题吧! artDi ...
- ACE框架 同步原语设计
ACE框架常用的同步机制设计成统一的原语接口.同步原语使用系统平台(操作系统,多线程库)提供的同步原语,并为系统平台不提供的同步原语提供模拟实现.ACE框架使用了外观模式和适配器分两层,将同步原语统一 ...
- WebView加载页面的两种方式——网络页面和本地页面
WebView加载页面的两种方式 一.加载网络页面 加载网络页面,是最简单的一种方式,只需要传入http的URL就可以,实现WebView加载网络页面 代码如下图: 二.加载本地页面 1.加载asse ...
- Hopfield神经网络实现污染字体的识别
这个网络的内部使用的是hebb学习规则 贴上两段代码: package geym.nn.hopfiled; import java.util.Arrays; import org.neuroph.co ...
- 微信创建带参数二维码并加上logo
1.因为带参数二维码有两种,分别是字符参数,数值参数,因此,在写创建方法的时候,需要进行判断 public void ShowQcCode(N_WX_QrCode code) { QRCodeCrea ...
- hdu1198 Farm Irrigation 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 简单并查集 分别合并竖直方向和水平方向即可 代码: #include<iostream&g ...
- Commonjs规范及Node模块实现
前面的话 Node在实现中并非完全按照CommonJS规范实现,而是对模块规范进行了一定的取舍,同时也增加了少许自身需要的特性.本文将详细介绍NodeJS的模块实现 引入 nodejs是区别于java ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...