C#基础知识复习

来源:互联网 发布:linux 6.0语言改为中文 编辑:程序博客网 时间:2024/05/30 23:01
强调代码规范
•规则(法律,必须遵守否则报错)
–语法
•规范(道德,大家都喜欢有道德的人。)
–注释//,/**/,///
–骆驼命名 :第一个单词首字母小写,之后的单词首字母大写 userName、userPassword、realName…(普通变量(局部变量)字段)
–帕斯卡命名:第一个单词首字母大写,之后的单词首字母大写 GetMax()、ChangeName()…(方法名类名、属性名
–定义的变量或者方法 名字要有意义。
•方法名:动词。Write()、Open()、Close()、Dispose()、GetUserId()、…(方法都是要做一件事情)
•变量名:按功能命名、按方法的返回值内容命名(userName=GetUserName();)

GetMax()  int     bool  isLogin


类和对象

•什么是面向对象?一种分析问题的方式(增强了程序的可扩展性)。
•面向对象三大特性:封装、继承、多态。
•什么是类?什么是对象?类和对象的区别?
类:类是模子,确定对象将会拥有的特征(属性)和行为(方法)
对象是一个你能够看得到、摸得着的具体实体万物皆对象
–类是模具,创建对象的模具,抽象的。
•类是一种数据类型,用户自定义的数据类型
•类组成:字段、属性、方法、构造函数,索引器等
–对象是具体的,是类的具体实例。对象具有属性(特征)和方法(行为)
–类中包含了数据(用字段表示)与行为(用方法(函数、功能)表示,方法为一块具有名称的代码)
•this ,当前对象 显示的调用自己的构造函数
•,base:调用父类的构造函数 在子类中调用父类的重名方法

知识点总结
•什么是面向对象?
•面向对象三大特性:封装、继承、多态。
•什么是类?什么是对象?类和对象的区别?
•提问:大家觉得什么是封装?或者说封装带给我们什么好处?
•类和对象本身就是封装的体现。
•1.属性封装了字段、2.方法的多个参数封装成了一个对象、3.将一堆代码封装到了一个方法中、4.将一些功能封装到了几个类中、5.将一些具有相同功能的代码封装到了一个程序集中(dll、exe)。 将一坨程序封装起来到一个程序集当中
•继承(是指类与类之间的关系。)
•为什么要继承?继承带给我们的好处?
•代码重用
•LSP里氏替换原则(通过代码说明一下,声明父类类型变量,指向子类类型对象,以及调用方法时的一些问题)、多态。类的单根继承性、传递性、继承时构造函数的问题(:this(), :base())。构造函数不能被继承。
•所有的类都直接或间接的继承
•自object。
•继承中的访问修饰符问题:(提一下protected即可。)

•virtual、abstract、接口区别与联系,总结。举例。
•接口存在的意义:多态。多态的意义:程序可扩展性。最终→节省
•成本,提高效率。
•接口解决了类的多继承的问题
•以后体积庞大的问题。
•接口之间可以实现多继承
•显示实现接口
多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

虚方法,抽象方法
关于虚方法需要注意的几点:
1.父类中如果有方法需要让子类重写,则可以将该方法标记为virtual
2.虚方法在父类中必须有实现,哪怕是空实现。
3.虚方法子类可以重写(override),也可以不重写
关于抽象方法注意的几点:
1.需要用abstract关键字标记
2.抽象方法不能有任何方法实现。(连大括号都不能有)
3.抽象成员必须包含在抽象类中。
4.由于抽象成员没有任何实现,所以子类必须将抽象成员重写。
5.抽象类不能实例化,
抽象类的作用:抽象类的作用就是为了让子类继承。
6.抽象类中可以包括抽象成员,可以包括有具体代码的成员。
7.还有抽象方法不能用static修饰


接口
1.接口中只能包含方法(属性、事件、索引器也都是方法)
2.接口中的成员都不能有任何实现。光说不做
3.接口不能被实例化。
4.接口中的成员不能有任何访问修饰符。(默认为public
5.实现接口的子类必须将接口中的所有成员全都实现。
6.子类实现接口的方法时,不需要任何关键字,直接实现即可。
7.接口存在的意义就是为了多态。

小总结
封装,继承,多态.
五个访问修饰符,
字段和属性
里氏转换
添加引用和导入命名空间
单例模式 


静态与非静态



•作业:定义父亲类Father(姓lastName,财产property,血型bloodType),儿子Son类(玩游戏PlayGame方法),女儿Daughter类(跳舞Dance方法),调用父类构造函数(:base())给子类字段赋值
•作业:定义汽车类Vehicle属性(brand(品牌),color(颜色))方法run,子类卡车(Truck) 属性weight载重 方法拉货,轿车(Car) 属性passenger载客数量 方法载客
•作业:员工类、部门经理类(部门经理也是员工,所以要继承自员工类。员工有上班打卡的方法。用类来模拟。
•作业:动物Animal   都有吃Eat和叫Bark的方法,狗Dog和猫Cat叫的方法不一样.父类中没有默认的实现所哟考虑用抽象方法。
•作业:计算形状Shape(圆Circle,矩形Square ,正方形Rectangle)的面积、周长
•作业:鸟-麻雀sparrow['spærəu] ,鸵鸟ostrich['ɔstritʃ] ,企鹅penguin['pengwin] ,鹦鹉parrot['pærət] 鸟能飞,鸵鸟,企鹅不能。。。你怎么办
•作业:橡皮rubber鸭子、木wood鸭子、真实的鸭子realduck。三个鸭子都会游泳,而橡皮鸭子和真实的鸭子都会叫,只是叫声不一样,橡皮鸭子“唧唧”叫,真实地鸭子“嘎嘎”叫,木鸭子不会叫.


第二部分


值类型、引用类型

值类型均隐式派生自System.ValueType
•数值类型、bool、结构、枚举
•查看IL,隐式继承自ValueType
引用类型派生自System.Object
•字符串、数组、类、接口等
•查看IL隐式继承自Object
引用类型变量的赋值只复制对对象的引用。
值类型变量赋值会拷贝一个副本。

值类型:

intchardoublefloatlongshortbyteboolenumstructdecimal

值类型都是派生自ValueType

值类型不能继承,只能实现接口。

引用类型:

string、数组、类(子定义数据类型)、接口、委托、

int[]n={1,2,3};//引用类型。

引用类型都派生自:Object

引用类型可以继承(类之间可以继承)

枚举

  一组和数值有关的常量

  enumGender {Male,Female}

  enumWeeks {星期日=0,星期一,}

  把字符串转换成枚举Genderg = (Gender)Enum.Parse(typeof(Gender),"Male");

结构

  就是小类,值类型

  不能继承类

  可以实现接口

  不能有显示无参构造函数(隐式)

  结构中不能给字段赋初始值

  

值传递,刚才讨论的参数传递方式都是值传递。
引用传递,ref,传递的是变量的地址。
值传递(普通的参数传递)
引用传递(ref(*)
值类型、引用类型
值传递、引用传递
值传递:
引用类型、值类型
引用传递(ref:
引用类型、值类型。

refout

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。
2、使用refout时,在方法的参数和执行方法时,都要加refout关键字。以满足匹配。
3out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。 


常用类库

l学习.net就是学习它的无数个类库怎么用,先看两个简单的
lString字符串,字符串可以看成字符数组,不可变特性(通过for循环,修改string中的元素,失败!)。
•属性
•Length //获得字符串中字符的个数。”aA我你他”→5
•方法
IsNullOrEmpty()  静态方法,判断为null或者为””
•ToCharArray() 将string转换为char[]
•ToLower()  小写,必须接收返回值。(因为:字符串的不可变);
•ToUpper()     大写。
•Equals()      比较两个字符串是否相同。  忽略大小写的比较,StringComparation.
•Contains 是否包含
IndexOf() 如果没有找到对应的数据,返回-1 
LastIndexOf() 如果没有找到对应的数据,返回-1
Substring()  //2个重载,截取字符串。
•Split()  //分割字符串。 
•Join()  静态方法
•Replace()  Trim() 

l注意:对字符串的操作一定要用变量接收返回值。(字符串是不能变的,每次都是构建一个新的字符串)
lstrings=“abc”;
ls=s.Replace(‘c’,’C’);

l课上练习1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。"abc"→"cba"
l课上练习2:接收用户输入的一句英文,将其中的单词以反序输出。      “I love you"→“i evol uoy"
l课上练习3:”2012年12月21日”从日期字符串中把年月日分别取出来,打印到控制台



lStringBuilder高效的字符串操作
•当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作。
•String对象是不可变的。每次使用 System.String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常大。 如果要修改字符串而不创建新的对象,则可以使用 System.Text. StringBuilder 类。 例如,当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。
lStringBuilder  != String//StringBuilder转换为String.ToString();
lStringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换为String.
•StringBuilder sb =new StringBuilder();
•sb.Append();//追加字符串
•sb.ToString();//把StringBuilder转换为字符串。
•sb.Insert();
•sb.Replace();
l案例:使用程序拼html中的table

集合类(增、删、查、改、遍历)
l集合常用操作 添加、遍历、移除
l命名空间System.Collections
•ArrayList 可变长度数组,使用类似于数组
•属性 Capacity(集合中可以容纳元素的个数,翻倍增长); Count(集合中实际存放的元素的个数。)
•方法
•Add()  AddRange(Icollection c)  Remove()RemoveAt()Clear()
•Contains()  ToArray() Sort() 排序\Reverse();//反转
•Hashtable 键值对的集合,类似于字典,Hashtable在查找元素的时候,速度很快。
•Add(objectkey,objectvalue);
•hash[“key”]
•hash[“key”]=“修改”;
•.ContainsKey(“key”);
•Remove(“key”);
•遍历:
•hash.Keys
•hash.Values/DictionaryEntry

l案例:两个(List)集合{ “a”,“b”,“c”,“d”,“e”}{ “d”, “e”, “f”, “g”, “h” },把这两个集合去除重复项合并成一个。
l案例:随机生成101-100之间的数放到List中,要求这10个数不能重复,并且都是偶数(添加10次,可能循环很多次。)
Randomrandom=new Random();
random.next(1,101);//随即生成1-100之间的数。
l练习:有一个字符串是用空格分隔的一系列整数,写一个程序把其中的整数做如下重新排列打印出来:奇数显示在左侧、偶数显示在右侧。比如”2 78 3 22 9 5 11”显示成”7 39 2 8 22….”

注意事项:不要把Random的实例化放到循环里面

可以使用两个集合来降低产生随机数的循环次数。

Random在循环中会降低执行效率(每次new的时候的种子是一样的,当前时间。)(*)



泛型集合:使用泛型集合
书橱
命名空间System.Collections.Generic
•List<T>类似于ArrayList,ArrayList的升级版。
•各种方法:Sort()、Max()、Min()、Sum()…
•Dictionary<K,V>类似于Hashtable,Hashtable的升级版。
•推荐使用泛型集合。
T,K,V就像一把锁,锁住集合只能存某种特定的类型,这里的T,K,V也可以是其它字母
泛型集合可以进行foreach遍历,是因为实现了IEnumerable<T>具有了GetEnumerator()方法

l案例:把分拣奇偶数的程序用泛型实现。int[]nums={1,2,3,4,5,6,7,8,9};奇数在左边 偶数在右边
l练习1:将int数组中的奇数放到一个新的int数组中返回。
l将数组中的奇数取出来放到一个集合中,最终将集合转换成数组 。
l
l练习2:从一个整数的List<int>中取出最大数(找最大值)。
l练习:把123转换为:壹贰叁。Dictionary<char,char>
l“1一 2二3三 4四 5五 6六 7七 8八 9九”
l练习:计算字符串中每种字符出现的次数(面试题)。 “WelcometoChinaworld,不区分大小写,打印“W2”“e2”“o 3”……
提示:Dictionary<char,int>,char的很多静态方法。char.IsLetter()
l案例:两个(ArrayList)集合{ “a”,“b”,“c”,“d”,“e”}和{ “d”, “e”, “f”, “g”, “h” },把这两个集合去除重复项合并成一个。


神奇的Dictionary
l自己动手写Dictionary<string, string> 。Dictionary性能测试。为什么速度这么快?
l查字典为什么能这么快?目录中记录了每个汉字的页码,查找的时候先看汉字的页码,再翻到指定的页就可以非常快速的找到词条了。
lDictionary中有一个存储键值对的区域,这个区域的每个存储单元有地址编号,根据hashCode算法,计算key的值的键值对应该存储的地址,将键值对放入指定的地址即可。查找的时候首先计算key的地址,就可以找到数据了。根据key找房间号,而不是逐个房间找。(*)
l为什么Dictionary这么快:当把一个kvp,采用一个固定算法(散列算法)根据key来计算这个kvp存放的地址。取的时候也是根据要找的key可以快速算出kvp存放的地址。

文件操作常用相关类
File //操作文件,静态类,对文件整体操作。拷贝、删除、剪切等。
Directory //操作目录(文件夹),静态类。
Path//对文件或目录的路径进行操作(很方便)【字符串】
Stream//文件流,抽象类。
•FileStream//文件流,MemoryStream(内存流),NetworkStream(网络流)
•StreamReader//快速读取文本文件
•StreamWriter//快速写入文本文件

Path类(对字符串操作),不用刻意记。
目录和文件操作的命名控件System.IO
stringChangeExtension(stringpath, string extension) (*)
•修改文件的后缀,“修改”支持字符串层面的,没有真的给文件改名
•string s =Path.ChangeExtension(@"C:\temp\F3.png", "jpg")
stringCombine(string path1, string path2)
•将两个路径合成一个路径,比用+好,可以方便解决不加斜线的问题,自动处理路径分隔符的问题
•string s = Path.Combine(@"c:\temp","a.jpg")
stringGetDirectoryName(stringpath) (*)
•得到文件的路径名。Path.GetDirectoryName(@"c:\temp\a.jpg")
stringGetExtension(stringpath) 得到文件的扩展名
stringGetFileName(stringpath) 得到文件路径的文件名部分
stringGetFileNameWithoutExtension(stringpath) 得到去除扩展名的文件名
stringGetFullPath(stringpath) 得到文件的全路径。可以根据相对路径获得绝对路径。

知识补充1(*)
lPath.Combine(path1,path2),见MSDN
•如果指定的路径之一是零长度字符串,则该方法返回其他路径。如果 path2包含绝对路径,则该方法返回 path2。
•如果path1不是以分隔符结束,并且不是c:或d:等(驱动器引用),则在串联前为path1增加\分隔符。
•分隔符:(与操作系统平台有关)
•Path.DirectorySeparatorChar  →  \
•Path.PathSeparator  →  ;
•Path.VolumeSeparatorChar  →  :
lPath.GetFileName()
•获取文件名
•当目录为c:\windows\test时,可获取最后一个目录名,但当目录路径为c:\windows\test\时,不可以。reflector查看

操作文件(File)
文本文件编码,文本文件有不同的存储方式,将字符串以什么样的形式保存为二进制,这个就是编码,UTF-8、ASCII、Unicode等,如果出现乱码一般就是编码的问题,文本文件相关的函数一般都有一个Encoding类型的参数,取得编码的方式:Encoding.Default、Encoding.UTF8、Encoding.GetEncoding("GBK")
输出Encoding.GetEncodings(),所有编码。
什么是文本文件。拖到记事本中还能看得懂的就是文本文件,doc不是。
File类的常用静态方法:(FileInfo*)
•void AppendAllText(stringpath, string contents),将文本contents附加到文件path中
•bool Exists(string path)判断文件path是否存在
•string[] ReadAllLines(stringpath) 读取文本文件到字符串数组中
•string ReadAllText(string path) 读取文本文件到字符串中
•void WriteAllText(stringpath, string contents)将文本contents保存到文件path中,会覆盖旧内容。
•WriteAllLines(stringpath,string[]contents),将字符串数组逐行保存到文件path中,会覆盖旧内容。


File类的方法1

File.Copy(“source”,“targetFileName”, true);//文件拷贝,true表示当文件存在时“覆盖”,如果不加true,则文件存在报异常。
File.Exists();//判断文件是否存在
File.Move(“source”,“target”);//移动(剪切),思考如何为文件重命名?
File.Delete(“path”);//删除。如果文件不存在?不存在,不报错
File.Create(“path”);//创建文件

操作文本文件:

File.ReadAllLines(“path”,Encoding.Default);//读取所有行,返回string[]
File.ReadAllText(“path”,Encoding.Default);//读取所有文本返回string
File.ReadAllBytes(“path”);//读取文件,返回byte[],把文件作为二进制来处理。
l===========================================
File.WriteAllLines(“path”,new string[4] ,Encoding.Default);//将string数组按行写入文件。
File.WriteAllText(“path”,“string”);//将字符串全部写入文件
File.WriteAllBytes(“path”,newbyte[5]);//将byte[]全部写入到文件
File.AppendAllText()//将string追加到文件


快速得到文件流:

FileStreamfs=File.Open();//返回FileStream
FileStreamfs=File.OpenRead();//返回只读的FileStream
FileStreamfs=File.OpenWrite();//返回只写的FileStream
FileStream fs=newFileStream(参数);

Stream(所有流的父类,是一个抽象类。)
文件操作的类都在System.IO.*;

文件流?
两个大水缸,把一个缸中的水倒入另一个水缸中。两种方式:
直接把一个缸中的水倒入另一个缸中
用个桶来把一个缸中的水舀到另一个缸中。

使用FileStream写入文本文件。
•演示通过FileStream写入读取文本文件。对于中文如果每次读取1个byte会有什么效果?更好的选择→StreamReader
使用FileStream读取文本文件。
使用FileStream进行大文件拷贝。
•演示File.ReadAllBytes()与File.WriteAllBytes()进行文件拷贝。(查看内存使用情况)
只有使用using可以方便的释放资源(自动调用Dispose方法)
实现了IDispose接口的类才能使用using释放资源



byte[]是任何数据的最根本表示形式,任何数据最终都是二进制。
使用using来简化操作。
•//总结:不是任何类型的对象都可以写在using()的小括号里面的
•//只有实现了IDisposable接口的类型的对象,才能写在using的小括号里面
•//当using{}执行完毕时,会自动调用对象的Dispose()方法来释放资源。
大文件拷贝。

Read用户读取若干字节。(*)//可以手动设置获取该值。


lFileStream的参数介绍。与快速创建文件流



StreamWriter(读取文本文件)
Stream把所有内容当成二进制来看待,如果是文本内容,则需要程序员来处理文本和二进制之间的转换。
用StreamWriter可以简化文本类型的Stream的处理
StreamWriter是辅助Stream进行处理的

 using (StreamWriter writer = newStreamWriter(stream,encoding))

 {

      writer.WriteLine("你好");

 }


和StreamWriter类似, StreamReader简化了文本类型的流的读取。

 Stream stream =File.OpenRead("c:/1.txt");

   using (StreamReader reader = newStreamReader(stream,encoding))

            {

               //Console.WriteLine(reader.ReadToEnd());

               Console.WriteLine(reader.ReadLine());

            }

ReadToEnd用于从当前位置一直读到最后,内容大的话会占内存;每次调用都往下走,不能无意中调用了两次

ReadLine读取一行,如果到了末尾,则返回null。

★说一下快速创建流的那几个方式。★


案例:对职工工资文件处理,所有人的工资加倍然后输出到新文件。
文件案例:
•马大哈|3000
•宋江|8000
提示:
•先获得FileStream
•File.OpenRead(path);  File.OpenWrite(path);
•再用FileStream构建一个StreamReaderStreamWriter



对象序列化(二进制序列化)

对象序列化是将对象(比如Person对象)转换为二进制数据(字节流),反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。
对象序列化,只能针对对象的字段进行序列化。
BinaryFormatter类有两个方法:
•voidSerialize(Stream stream,object graph)对象graph序列化到stream中
•objectDeserialize(Stream stream)将对象从stream中反序列化,返回值为反序列化得到的对象
练习:将几个int、字符串添加到ArrayList中,然后序列化到文件中,再反序列化回来
不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化


//关于二进制序列化需要注意的事项:
1.要序列化的类型必须标记为:[Serializable]
2.该类型的父类也必须标记为: [Serializable]
3.该类型中的所有成员的类型也必须标记为: [Serializable]
4.序列化只会对类中的字段序列化。(只能序列化一些状态信息。)
为什么要序列化?
•将一个复杂的对象转换流,方便我们的存储与信息交换

序列化的步骤
1.创建一个二进制序列化器:
•BinaryFormatterbf=…..;
1.5:创建一个文件流。
2.bf.Serialize(stream,对象);


反序列化的步骤
1.创建一个二进制序列化器:
•BinaryFormatter bf;
2.创建文件流:
3.执行反序列化:
•objectobj=bf.Deserialize(stream);


第五部分:XML(可扩展标记语言)
lXML:eXtensibleMarkupLanguage
l什么是标记语言?什么是标记?
•标记(markup):文档中任何不想被打印输出的部分(不是真正的文档的内容,联想读书时做的“读书笔记”,在旁边写的注解等。)注解是注解,实际内容是实际内容。
•标记的作用:传递了关于文档本身以外的额外信息。比如:标记文档的某部分该如何显示,某部分是什么意思等。重在数据,标记只是为了说明数据的含义而已。
l常见的标记语言:SGML、HTML、XML
lHTML与XML的区别与联系?
•Xml作用与应用场合:xml数据存储,html数据展示。
•语法、是否有预定义标签、各自的作用与意义
•相关术语:标签、节点、根节点、元素、子元素、后代元素、属性、嵌套、命名空间、字符数据(CDATA)

Xml语法特点
1.严格区分大小写
2.有且只能有一个根节点
3.有开始标签必须有结束标签不严谨)
4.属性必须使用双引号
5.没有预定义标签与html不一样
6.文档声明:<?xml version="1.0"encoding="utf-8"?>
7.注释:<!---->
8.CDATA区:即原意文本-<![CDATA[…]]>
9.注意编码问题,文本文件实际编码要与文档声明中的编码一致。

1.Xml中只能有一对根节点,其他节点都必须包含在根节点中。

  2.xml是大小写敏感的。开始标记如果是大写,结束标记也必须是大写。

  3.xml对语法要求很严格,有开始标记,必须有结束标记。

  4.对于标记的属性的值必须用双引号引起来。

  5.xml的标记是可以嵌套的。

  6.xml中所有的元素都叫节点,但不是所有的节点都叫元素(标签)

  7.注释,叫节点,但不叫元素。



Linq ToXML:写
l读写XML有很多技术,1.Dom[XmlDocument、XDocument](文档对象模型,将整个xml加载到内存中,然后操作)、2.Sax(事件驱动,.net中使用XmlReader(XmlTextReader)、XmlWriter(XmlTextWriter)来替代)等,还有高级的读写技术3.XmlSerializer(xml序列化,需要先定义类)、 4.LinqTo XML(System.Xml.Linq),用到的就是Xdocument,Xelement等等, XmlSerializer要求对每种不同的文件都定义一套类,很麻烦,而Linq ToXML则不需要单独创建类,当然更底层一些,代码比XmlSerializer多,灵活性更高。System.Xml下的类是2.0及之前操作xml推荐的,现在很多人也仍然在用这个namespace下的类,这个namespace下的类和Linq To XML非常相似,因此不用单独学。
l核心类XElement,一个XElement表示一个元素,new XElement(“Order”),创建一个名字为Order的标签,调用Add增加子元素,也是XElement 对象,和TreeView一样。
l想得到字符串怎么办?ToString
l调用XElement的Save方法将xml内容保存在Writer中
l创建xml的时候可以用XDocument也可以不用。(直接用XElement)


l<!--fffff-->是注释(Comment),<connectionStrings>是元素(Element),他们都是节点(Node)。因为Nodes返回的即可能是注释,也可能是元素,所以只能返回Node类型。
lxdoc.Elements()//只返回元素
lxdoc.Nodes()返回所有节点(包括注释等。)
l//Descendants()在子孙后代中找标签名为DefaultTask的元素
l                    //慎用,容易取错结点
l                    //var task =

Xml的约束:
lXml没有任何预定义标签,可以任意定义想要的标签。
l查看App.config或者Web.config中的元素,并不是可以随意定义的。

通过应用程序操作XML
l三种方式:
1>DomDocument Object Model)方式,Xml看做树,每个元素是节点(联想TreeView
XmlDocument→.net2.0
XDocument→net3.xLinq to Xml
2>SAXSimple API for XML)方式,事件模型。在.net中则使用:(XmlReaderXmlWriter)SAXpush,XmlReader则是pull.
3>Xml序列化:XmlSerializer
l若干练习与案例:
先介绍xpath
xml
List集合数据导出到xml
xmlTreeView递归显示
后面的案例
Xml增删查改+登录

Linq ToXML:读
lXDocumentdoc = XDocument.Load(reader),加载XML文件,XDocument就是加载的对象
l解析订单号:doc.Root.Element("OrderNumber").Value
l遍历订单项:

foreach(XElement element indoc.Root.Descendants("Items").Descendants("OrderItem"))

            {

                Console.WriteLine("商品名:{0},数量:{1}",element.Element("ItemName").Value,element.Element("Count").Value);

            }

l读取属性,Attribute(""),读取带属性的订单

foreach(XElement element indoc.Root.Descendants("Items").Descendants("OrderItem"))

            {

                Console.WriteLine("商品名:{0},数量:{1}",element.Attribute("Name").Value,element.Attribute("Count").Value);

            }

l使用Linq来进行XML的操作(*),代码见备注
l手写XML来读,这样锻炼手写XML的能力。


lSchemaDTD:在App.Config中“转到定义”会看到文件的定义约束文件,DTD约束能有哪些属性、能有哪些元素。

























0 0
原创粉丝点击