原文:http://blog.csdn.net/qq1355541448/article/details/8307063
无处不在的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 <?xml version="1.0" encoding="gb2312"?> 2 <guoxing> 3 <technicalsection count="50" room="1403"> 4 <employee TNo="gx001"> 5 <name>陈涛</name> 6 <age>18</age> 7 <gender>男</gender> 8 </employee> 9 <employee TNo="gx001"> 10 <name>陈涛2</name> 11 <age>18</age> 12 <gender>男</gender> 13 </employee> 14 <employee TNo="gx001"> 15 <name>陈涛3</name> 16 <age>18</age> 17 <gender>男</gender> 18 </employee> 19 <employee TNo="gx001"> 20 <name>陈涛4</name> 21 <age>18</age> 22 <gender>男</gender> 23 </employee> 24 <employee TNo="gx001"> 25 <name>陈涛5</name> 26 <age>18</age> 27 <gender>男</gender> 28 </employee> 29 </technicalsection> 30 31 <salesdepartment count="50" room="1506"> 32 33 </salesdepartment> 34 </guoxing>
可以用浏览器进行预览。
六、在浏览器中进行预览的效果
接下来我们就介绍通过程序来写一个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 <?xml version="1.0" encoding="utf-8" ?> 2 <CFX> 3 <MSG> 4 <交易码 val="1000"/> 5 <流水号 val="100000000000000001"/> 6 <金额 val="1234567890.12"/> 7 <付款机构 val="腾讯销售部"/> 8 <付款单位账号 val="12345678901234567890"/> 9 <收款机构 val="新浪财务部"/> 10 <收款单位账号 val="12345678901234567890"/> 11 </MSG> 12 <MSG> 13 <交易码 val="1000"/> 14 <流水号 val="100000000000000002"/> 15 <金额 val="1234567890.12"/> 16 <付款机构 val="1234"/> 17 <付款单位账号 val="12345678901234567890"/> 18 <收款机构 val="1234"/> 19 <收款单位账号 val="12345678901234567890"/> 20 </MSG> 21 <MSG> 22 <交易码 val="1000"/> 23 <流水号 val="100000000000000003"/> 24 <金额 val="1234567890.12"/> 25 <付款机构 val="1234"/> 26 <付款单位账号 val="12345678901234567890"/> 27 <收款机构 val="1234"/> 28 <收款单位账号 val="12345678901234567890"/> 29 </MSG> 30 <MSG> 31 <交易码 val="1000"/> 32 <流水号 val="100000000000000004"/> 33 <金额 val="1234567890.12"/> 34 <付款机构 val="1234"/> 35 <付款单位账号 val="12345678901234567890"/> 36 <收款机构 val="1234"/> 37 <收款单位账号 val="12345678901234567890"/> 38 </MSG> 39 <MSG> 40 <交易码 val="1000"/> 41 <流水号 val="100000000000000005"/> 42 <金额 val="1234567890.12"/> 43 <付款机构 val="1234"/> 44 <付款单位账号 val="12345678901234567890"/> 45 <收款机构 val="1234"/> 46 <收款单位账号 val="12345678901234567890"/> 47 </MSG> 48 <MSG> 49 <交易码 val="1000"/> 50 <流水号 val="100000000000000006"/> 51 <金额 val="1234567890.12"/> 52 <付款机构 val="1234"/> 53 <付款单位账号 val="12345678901234567890"/> 54 <收款机构 val="1234"/> 55 <收款单位账号 val="12345678901234567890"/> 56 </MSG> 57 <MSG> 58 <交易码 val="1000"/> 59 <流水号 val="100000000000000007"/> 60 <金额 val="1234567890.12"/> 61 <付款机构 val="1234"/> 62 <付款单位账号 val="12345678901234567890"/> 63 <收款机构 val="1234"/> 64 <收款单位账号 val="12345678901234567890"/> 65 </MSG> 66 <MSG> 67 <交易码 val="1000"/> 68 <流水号 val="100000000000000008"/> 69 <金额 val="1234567890.12"/> 70 <付款机构 val="1234"/> 71 <付款单位账号 val="12345678901234567890"/> 72 <收款机构 val="1234"/> 73 <收款单位账号 val="12345678901234567890"/> 74 </MSG> 75 <MSG> 76 <交易码 val="1000"/> 77 <流水号 val="100000000000000009"/> 78 <金额 val="1234567890.12"/> 79 <付款机构 val="1234"/> 80 <付款单位账号 val="12345678901234567890"/> 81 <收款机构 val="1234"/> 82 <收款单位账号 val="12345678901234567890"/> 83 </MSG> 84 <MSG> 85 <交易码 val="1000"/> 86 <流水号 val="100000000000000010"/> 87 <金额 val="1234567890.12"/> 88 <付款机构 val="1234"/> 89 <付款单位账号 val="12345678901234567890"/> 90 <收款机构 val="1234"/> 91 <收款单位账号 val="12345678901234567890"/> 92 </MSG> 93 <MSG> 94 <交易码 val="1000"/> 95 <流水号 val="100000000000000011"/> 96 <金额 val="1234567890.12"/> 97 <付款机构 val="1234"/> 98 <付款单位账号 val="12345678901234567890"/> 99 <收款机构 val="1234"/> 100 <收款单位账号 val="12345678901234567890"/> 101 </MSG> 102 <MSG> 103 <交易码 val="1000"/> 104 <流水号 val="100000000000000012"/> 105 <金额 val="1234567890.12"/> 106 <付款机构 val="1234"/> 107 <付款单位账号 val="12345678901234567890"/> 108 <收款机构 val="1234"/> 109 <收款单位账号 val="12345678901234567890"/> 110 </MSG> 111 <MSG> 112 <交易码 val="1000"/> 113 <流水号 val="100000000000000013"/> 114 <金额 val="1234567890.12"/> 115 <付款机构 val="1234"/> 116 <付款单位账号 val="12345678901234567890"/> 117 <收款机构 val="1234"/> 118 <收款单位账号 val="12345678901234567890"/> 119 </MSG> 120 <MSG> 121 <交易码 val="1000"/> 122 <流水号 val="100000000000000014"/> 123 <金额 val="1234567890.12"/> 124 <付款机构 val="1234"/> 125 <付款单位账号 val="12345678901234567890"/> 126 <收款机构 val="1234"/> 127 <收款单位账号 val="12345678901234567890"/> 128 </MSG> 129 <MSG> 130 <交易码 val="1000"/> 131 <流水号 val="100000000000000015"/> 132 <金额 val="1234567890.12"/> 133 <付款机构 val="1234"/> 134 <付款单位账号 val="12345678901234567890"/> 135 <收款机构 val="1234"/> 136 <收款单位账号 val="12345678901234567890"/> 137 </MSG> 138 </CFX>
在做之前我们先分析一下这个XML文件,有一个根节点CFX,有多条MSG。每个MSG里面包括交易码,流水号,金额。
二十五、还是先把XML文件拷贝过来
二十六、读取交易记录的xml的代码
现在我们观察这么一段XML文件。
二十七、需要观察的xml代码
文件中有四位同学,现在请获取一年级同学的信息。
现在我们有种相对简单的办法。
二十八、引入xml文件
二十九、XmlDocument所在的命名空间
三十、xpath应用演示
大家在MSDN里面输入xpath就能找到xpath每个表达式每个意思。
下面是我搜集的xpath表达式的连接,大家可以点击查看。
XPath 表达式
下面我们先说一个问题,就是XML的序列化问题:
三十一、xml序列化需要用到的类
三十二、序列化person对象
三十三、序列化成功
三十四、序列化list集合,注意变化的地方
三十五、list序列化成功
这样我们通过xml序列化可以非常方便的把一个对象直接写成个xml文件。
反序列化变成了xmlSer.Deserialize();
现在讲讲刚才我们提出的问题,为什么需要传递typeof(List<Person>)。我们拿到对象的类型能干什么呢?
如果一时想不出来,看下下面的案例:
三十六、例题
像上面这样写,能写进去,但是有个问题,如果我再写几个对象进去,属性这块能不能动态的获取呢?参考下系统给我们提供的方法,反射,通过类型获取成员。xml序列化就是通过反射来完成的。
自己思考下怎么自己写xml序列化:(小提示)
三十七、小提示
在xml序列化里面还有一个特性:
三十八、[XmlIgnreAttribute]特性
接下来我们看下关于深拷贝、浅拷贝的问题:
这个问题在面试的时候也是时有出现的。我们大家得知道什么是深拷贝、浅拷贝,以及让我们去做的话怎么去实现。
我写一段代码,大家观察。
三十九、从案例中明白什么是深拷贝,什么是浅拷贝
下面看如何实现深拷贝、浅拷贝。
四十、浅拷贝是它父类的方法
测验一下:
四十一、p1和p2栈地址堆地址不一样
四十二、表示浅拷贝对于引用类型确实指向同一块内存
四十三、实现浅拷贝的代码
四十四、深拷贝的测验
四十五、深拷贝代码