无处不在的XML
在学习XML之前我们先想一下,在之前我们见过这个东西么?
主要作用是做数据的存储,而HTML是做数据的展现.
当我们用数据库存储的时候的优点是,安全度高,查询方便.缺点就是数据量小的时候,用数据库有点杀鸡用牛刀的感觉.而且数据库这种存储方式必须依赖某个软件才能查看.
用文本文件的优点是,快速,方便.缺点就是:不安全.设计格式不太方便.
XML是个文本文件,任何操作系统都能识别,能把我们要的数据结构化的存储起来.
Office2007的文件格式docx、xlsx、pptx都是xml,先改成rar文件然后解压。
XML和HTML的区别:
- XML有且只能有一个根元素
- XML严格区分大小写—如果是大写就全是大写,如果是小写就全是小写
- XML中的属性都必须用引号引起来(推荐:双引号)
- 元素有开始,必须有结束.
一、XML和HTML的区别演示代码
HTML有一些预定义的标签,而XML则没有。HTML标签不能扩展,XML可以扩展。除了头上面这个是预定义好的:<?xml version=”1.0” encoding=”gb2312”?>
在XML里面有一个规范xsd,在这里我们不学怎么写规范,只是学习一下怎么去用XML就可以了。
二、应用程序配置文件
这个配置文件就是个XML文件,经常用的就是数据库连接。
三、XML文档规范
XML当中的嵌套问题:
四、XML当中的嵌套
用记事本就可以编写XML文件,通过程序来写怎么来写呢?
1.Dom[XmlDocument、XDocument](文档对象模型,将整个xml加载到内存中,然后操作)、
2.Sax(事件驱动,.net中使用XmlReader(XmlTextReader)、XmlWriter(XmlTextWriter)来替代)等,还有高级的读写技术
3.XmlSerializer(xml序列化,需要先定义类)、
4.Linq To XML(System.Xml.Linq)等, XmlSerializer要求对每种不同的文件都定义一套类,很麻烦,而Linq To XML则不需要单独创建类,当然更底层一些,代码比XmlSerializer多,灵活性更高。System.Xml下的类是2.0及之前操作xml推荐的,现在很多人也仍然在用这个namespace下的类,这个namespace下的类和Linq To XML非常相似,因此不用单独学。
下面我们手动写一个XML.我就用记事本写了.
存储单位的所有的员工:
五、新建xml文件
插入手写的XML文件,存储员工信息。
1 23 4 30 315 9陈涛 618 7男 810 14陈涛2 1118 12男 1315 19陈涛3 1618 17男 1820 24陈涛4 2118 22男 2325 29陈涛5 2618 27男 2832 33 34
可以用浏览器进行预览。
六、在浏览器中进行预览的效果
接下来我们就介绍通过程序来写一个XML文件。和通过程序来读XML文件。
下把我们刚自己手动写好的XML文件拷入程序,然后,读取下。
七、添加XML文件
八、递归输出每个节点
在还有子元素的情况下,我们这里已经没办法再遍历出来了。所以在这里我们就考虑递归了。
九、递归显示每个子元素代码
接下来我们在读取其中的属性
十、输出属性的代码
现在我只想输出count属性,怎么办呢?
item.Attribute(“count”);//根据属性名来获取指定的属性的值。
在name标签里面还有值,怎么才能打印出来里面的值呢?当没有子元素的时候就把值打印出来。
判断一下当前标签是否有子元素。
十一、把没有子元素的值也打印出来
上面我们是把XML显示在控制台上了,要是加载到treeview就比较的清晰了。(作业)
XML当中的其它一些个基本概念。
在XML当中可以写个注释
注释不能算是XML的元素,但是这些都是XML的节点。所以注释打印不出来。
xdoc.Elements()//只返回元素
xdoc.Nodes()返回所有节点(包括注释等。)
xeRoot.Elements(“net”)搜索直接子元素
xeRoot.Descendants(“net”);搜索所有后代元素。
将XML文件递归加载到treeview上。
十二、画好界面,加载好文件
十三、递归到树
网页RSS订阅
打开网站看新闻的时候,会有很多的广告。在网站上找到RSS。
十四、点击:XML订阅
对于各大网站,如果我们只看新闻的标题,不看内容的话,对于我们看新闻来讲会更加的直接。
打开foxmail
十五、RSS订阅
formail是怎么得到网页当天的新闻的呢?是连上网页的数据库了么?这是不可能的。我们把刚才的网页xml文件下载-另存为一下。
十六、下载xml文件
十七、用高级记事本打开看下里面的内容
想让它正常格式显示的话,复制-粘贴到xml文件
十八、新建xml文件
在我们的编辑工具里面,ctrl+K+D,自动格式化了。去掉外部样式表,就跟我们自己写的xml一回事儿了。
十九、普通的xml文件
xml文件当中只有一个根节点,包含了什么内容呢?包含channel这个节点。formail通过title识别哪个频道,我们的formail之所以能看到新闻,就是它读取并且解析了这个xml文件。
把这个xml文件放到我们写的项目下,
二十、也能实现加载内容
xml案例
读取order.xml文件,一行一行的输出。
二十一、将xml文件拷贝过来
二十二、需要我们读取并且输出的xml文件
二十三、读取订单xml文件内容并输出的代码
我们在看下面一个案例:
二十四、银行交易数据读写
案例中需要用到的XML文件插入位置:
1 23 4 <交易码 val="1000" /> 5 <流水号 val="100000000000000001" /> 6 <金额 val="1234567890.12" /> 7 <付款机构 val="腾讯销售部" /> 8 <付款单位账号 val="12345678901234567890" /> 9 <收款机构 val="新浪财务部" /> 10 <收款单位账号 val="12345678901234567890" /> 11 1213 <交易码 val="1000" /> 14 <流水号 val="100000000000000002" /> 15 <金额 val="1234567890.12" /> 16 <付款机构 val="1234" /> 17 <付款单位账号 val="12345678901234567890" /> 18 <收款机构 val="1234" /> 19 <收款单位账号 val="12345678901234567890" /> 20 2122 <交易码 val="1000" /> 23 <流水号 val="100000000000000003" /> 24 <金额 val="1234567890.12" /> 25 <付款机构 val="1234" /> 26 <付款单位账号 val="12345678901234567890" /> 27 <收款机构 val="1234" /> 28 <收款单位账号 val="12345678901234567890" /> 29 3031 <交易码 val="1000" /> 32 <流水号 val="100000000000000004" /> 33 <金额 val="1234567890.12" /> 34 <付款机构 val="1234" /> 35 <付款单位账号 val="12345678901234567890" /> 36 <收款机构 val="1234" /> 37 <收款单位账号 val="12345678901234567890" /> 38 3940 <交易码 val="1000" /> 41 <流水号 val="100000000000000005" /> 42 <金额 val="1234567890.12" /> 43 <付款机构 val="1234" /> 44 <付款单位账号 val="12345678901234567890" /> 45 <收款机构 val="1234" /> 46 <收款单位账号 val="12345678901234567890" /> 47 4849 <交易码 val="1000" /> 50 <流水号 val="100000000000000006" /> 51 <金额 val="1234567890.12" /> 52 <付款机构 val="1234" /> 53 <付款单位账号 val="12345678901234567890" /> 54 <收款机构 val="1234" /> 55 <收款单位账号 val="12345678901234567890" /> 56 5758 <交易码 val="1000" /> 59 <流水号 val="100000000000000007" /> 60 <金额 val="1234567890.12" /> 61 <付款机构 val="1234" /> 62 <付款单位账号 val="12345678901234567890" /> 63 <收款机构 val="1234" /> 64 <收款单位账号 val="12345678901234567890" /> 65 6667 <交易码 val="1000" /> 68 <流水号 val="100000000000000008" /> 69 <金额 val="1234567890.12" /> 70 <付款机构 val="1234" /> 71 <付款单位账号 val="12345678901234567890" /> 72 <收款机构 val="1234" /> 73 <收款单位账号 val="12345678901234567890" /> 74 7576 <交易码 val="1000" /> 77 <流水号 val="100000000000000009" /> 78 <金额 val="1234567890.12" /> 79 <付款机构 val="1234" /> 80 <付款单位账号 val="12345678901234567890" /> 81 <收款机构 val="1234" /> 82 <收款单位账号 val="12345678901234567890" /> 83 8485 <交易码 val="1000" /> 86 <流水号 val="100000000000000010" /> 87 <金额 val="1234567890.12" /> 88 <付款机构 val="1234" /> 89 <付款单位账号 val="12345678901234567890" /> 90 <收款机构 val="1234" /> 91 <收款单位账号 val="12345678901234567890" /> 92 9394 <交易码 val="1000" /> 95 <流水号 val="100000000000000011" /> 96 <金额 val="1234567890.12" /> 97 <付款机构 val="1234" /> 98 <付款单位账号 val="12345678901234567890" /> 99 <收款机构 val="1234" />100 <收款单位账号 val="12345678901234567890" />101 102103 <交易码 val="1000" />104 <流水号 val="100000000000000012" />105 <金额 val="1234567890.12" />106 <付款机构 val="1234" />107 <付款单位账号 val="12345678901234567890" />108 <收款机构 val="1234" />109 <收款单位账号 val="12345678901234567890" />110 111112 <交易码 val="1000" />113 <流水号 val="100000000000000013" />114 <金额 val="1234567890.12" />115 <付款机构 val="1234" />116 <付款单位账号 val="12345678901234567890" />117 <收款机构 val="1234" />118 <收款单位账号 val="12345678901234567890" />119 120121 <交易码 val="1000" />122 <流水号 val="100000000000000014" />123 <金额 val="1234567890.12" />124 <付款机构 val="1234" />125 <付款单位账号 val="12345678901234567890" />126 <收款机构 val="1234" />127 <收款单位账号 val="12345678901234567890" />128 129130 <交易码 val="1000" />131 <流水号 val="100000000000000015" />132 <金额 val="1234567890.12" />133 <付款机构 val="1234" />134 <付款单位账号 val="12345678901234567890" />135 <收款机构 val="1234" />136 <收款单位账号 val="12345678901234567890" />137 138
在做之前我们先分析一下这个XML文件,有一个根节点CFX,有多条MSG。每个MSG里面包括交易码,流水号,金额。
二十五、还是先把XML文件拷贝过来
二十六、读取交易记录的xml的代码
现在我们观察这么一段XML文件。
二十七、需要观察的xml代码
文件中有四位同学,现在请获取一年级同学的信息。
现在我们有种相对简单的办法。
二十八、引入xml文件
二十九、XmlDocument所在的命名空间
三十、xpath应用演示
大家在MSDN里面输入xpath就能找到xpath每个表达式每个意思。
下面是我搜集的xpath表达式的连接,大家可以点击查看。
下面我们先说一个问题,就是XML的序列化问题:
三十一、xml序列化需要用到的类
三十二、序列化person对象
三十三、序列化成功
三十四、序列化list集合,注意变化的地方
三十五、list序列化成功
这样我们通过xml序列化可以非常方便的把一个对象直接写成个xml文件。
反序列化变成了xmlSer.Deserialize();
现在讲讲刚才我们提出的问题,为什么需要传递typeof(List<Person>)。我们拿到对象的类型能干什么呢?
如果一时想不出来,看下下面的案例:
三十六、例题
像上面这样写,能写进去,但是有个问题,如果我再写几个对象进去,属性这块能不能动态的获取呢?参考下系统给我们提供的方法,反射,通过类型获取成员。xml序列化就是通过反射来完成的。
自己思考下怎么自己写xml序列化:(小提示)
三十七、小提示
在xml序列化里面还有一个特性:
三十八、[XmlIgnreAttribute]特性
接下来我们看下关于深拷贝、浅拷贝的问题:
这个问题在面试的时候也是时有出现的。我们大家得知道什么是深拷贝、浅拷贝,以及让我们去做的话怎么去实现。
我写一段代码,大家观察。
三十九、从案例中明白什么是深拷贝,什么是浅拷贝
下面看如何实现深拷贝、浅拷贝。
四十、浅拷贝是它父类的方法
测验一下:
四十一、p1和p2栈地址堆地址不一样
四十二、表示浅拷贝对于引用类型确实指向同一块内存
四十三、实现浅拷贝的代码
四十四、深拷贝的测验
四十五、深拷贝代码
四十六、浅拷贝,深拷贝图解
作者近期文章列表:
C#中级进阶教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#中级进阶教程,无任何商业目的。希望与更多的代码爱好者交流心得,也请高手多多指点!!!) | |
三层及其它内容 | |
SQL数据库 ADO.net | |
面向过程,面向对象中高级 | |
winform基础 | |
面向过程 | |
面向对象 | |
GDI+ | |
HTML概述以及CSS | |
JavaScript基础 | |
jQuery |