就业教程35g价值7600北风网发布xml基础_第1页
就业教程35g价值7600北风网发布xml基础_第2页
就业教程35g价值7600北风网发布xml基础_第3页
就业教程35g价值7600北风网发布xml基础_第4页
就业教程35g价值7600北风网发布xml基础_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XML基础什么是XML,学它有什么用。优点:容易读懂;格式标准任何语言都内置了XML分析引擎,不用单独进行文件分析引擎的编写。XML语法规范:标签(Tag)、嵌套(Nest)、属性。标签要闭合,属性值要用""包围,标签可以互相嵌套XML树,父节点、子节点、兄弟节点(siblings)XML和HTML的区别:XML中元素必须关闭;XML中元素的属性值必须用引号;XML大小写敏感(CaseSensitive)符合XML规范的HTML叫做“符合XHTML标准”。开发的网站必须通过W3C验证。Linq

To

XML:写读写XML有很多技术,Dom、Sax等,还有高级的读写技术XmlSerializer、Linq

ToXML(System.Xml.Linq)、System.Xml(XMLDocument)等,XmlSerializer要求对每种不同的文件都定义一套类,很麻烦,而LinqToXML则不需要单独创建类,当然更底层一些,代码比XmlSerializer多,灵活性更高。System.Xml下的类是2.0及之前操作

xml推荐的,现在很多人也仍然在用这个namespace下的类,这个namespace下的类和

Linq

To

XML非常相似,因此不用单独学。核心类XElement,一个XElement表示一个节点,newXElement("Order"),创建一个名字为Order的标签,调用Add增加子节点,也是XElement

对象,和TreeView一样。想得到字符串怎么办?ToString调用XElement的Save方法将xml内容保存在Writer中<!--fffff-->是注释(Comment),<connectionStrings>是元素(Element),他们都是节点(Node)。因为Nodes返回的即可能是注释,也可能是元素,所以只能返回Node类型。xdoc.Elements()//只返回元素xdoc.Nodes()返回所有节点(包括注释等。)//Descendants()在子孙后代中找标签名为DefaultTask的元素//慎用,容易取错结点//var

task

=xdoc.Descendants("DefaultTask").Single();Linq

To

XML:读XDocument

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

(XElement

element

in

doc.Root.Descendants("Items").Descendants("OrderItem")){Console.WriteLine("商品名:{0},数量:{1}",element.Element("ItemName").Value,element.Element("Count").Value);}读取属性,Attribute(""),读取带属性的订单foreach

(XElement

element

in

doc.Root.Descendants("Items").Descendants("OrderItem")){Console.WriteLine("商品名:{0},数量:{1}",element.Attribute("Name").Value,element.Attribute("Count").Value);}使用Linq来进行XML的操作(*),代码见备注手写XML来读,这样锻炼手写XML的能力。案例:银行交易数据读写<MSG><交易码val="1000"/><流水号val=""/><金额val="1234567890.12"/><付款机构val="1234"/><付款单位账号val="

90"/><收款机构val="1234"/><收款单位账号val="

90"/></MSG><MSG></MSG><CFX>••••••••••</CFX>读取上述文件,将其导入数据库,考虑事务cmd.Parameters.Clear();//容易丢详细xml和代码见:D:\我的文档\livemesh\如鹏\备课\dotnet\备课时代码\XML读写\烟台商行数据导入导出练习:将数据导出到xml文件。读写都要有。在两个公司的第一个活都是做xml的导入、导出,项目中经常用。简历项目中可以增加一个把客户数据导出到xml、从xml导入数据的功能。很典型的公司机试题。区分Value和Name和属性值。易错:“交易码”是节点Element,value才是属性是Attribute。网站输出RSS中就会用到读取数据库写XML。练习解析App.config。(*)大Job:解析Excel生成XML文件(文件另存为→保存类型“XML数据”)读取行、列。写一个ExcelParser类。会遇到命名空间的问题。分析WP7的WMappManifest.xml文件,输出DefaultTask的NavigationPage属性。XML扩展(*)XmlDocumentXPathNamespaceSchema、DTD:在App.Config中“转到定义”会看到文件的定义约束文件,DTD约束能有哪些属性、能有哪些元素。泛型参考教材:《C#图解教程》第19章复习,对比ArrayList和List<T>,ArrayList中的数据放进去以后再拿出来都是object标签,因此需要类型转换,而且很难阻止非法类型的加入。List<T>则可以指定盛放的数据的类型。用ArrayList编写泛型版MyList,只要在类名后用<>将类型占位用一个一个标识符来表示即可,惯例是一个T。在类中就可以用T来代表一个类型名了。class

MyClass<T>{public

void

PrintIt(T

item){Console.WriteLine(item);}}不一定是T,随便一个字母、单词都可以,比如K、V,T、TResult只是一个惯例泛型集合(*dropped)编写泛型版MyList,内部用ArrayList保存数据。提供:T

this[int

index]、void

Add(T

item)、intCount三个成员类名后可以写不止一个范型占位符。编写泛型

版MyDictionary,内部用Hashtable保存数据。提供:V

this[K

key]、void

Add(K

key,V

value)、ICollection<K>Keys三个成员,Keys内部用

List<T>来做转换。练习。泛型方法(*)泛型方法:方法也可以定义泛型,在方法名后用<>将类型标注即可static

IList<T>

ToList<T>(ArrayList

list){IList<T>

retList

=

new

List<T>();foreach

(object

obj

in

list){retList.Add((T)obj);}return

retList;泛型委托EventHandler<T>Func泛型的约束(*)约束父类或者接口:AAA<T>whereT:IDbConnection约束构造函数:AAA

<T>where

T:new(),AAA

<T>where

T:new()。泛型创建一个返回N个对象的方法。泛型创建一个对任意数据进行取最大元素的方法应用default(T)用来取类型的默认值。应用案例:MyLazyObject、MyNullable。只有非常消耗内存资源或者其他非托管资源的类才值得用Lazy<T>程序集(*)所有.Net类都是定义在某个Assembly(程序集)中的,.Net基本类是定义在mscorlib.dll中。exe也可以看做是类库,也可以引用。.net的exe也是Assembly,.net中的exe和dll的区别就是

exe中包含入口函数,其他没有区别,exe也可以当成dll那样引用、也可以反编译。GAC:全局程序集缓存。公用的Assembly放到GAC中。(*)Assembly类是对Assembly的描述(*)。AppDomain.CurrentDomain.GetAssemblies()获得程序所有的AssemblyAssembly.LoadFile(),动态从文件加载Assembly,不需要在编译的时候引用。反射:Type类(*)参考教材:《C#高级编程》7.5、7.6Type类可以叫做“类的类”,一个类型对应一个Type类的对象,通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方法等。Type就是对类的描述。获得Type对象的方法:通过类获得Type:Type

t=typeof(Person)通过对象获得类的Type:Type

t=p.GetType()调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。Type反射(*)Activator.CreateInstance(Typet)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。应用:通过配置文件动态创建对象。Type类的方法:boolIsAssignableFrom(Typec):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。ISettingsProvider

sp;DbSettingsProvider

bsp;AccessSettingsProvider

msp;sp可以从bsp、msp赋值(sp=bsp;sp=msp)。bsp可以从msp赋值(bsp=msp)。boolIsInstanceOfType(objecto):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)bool

IsSubclassOf(Type

c):判断当前类是否是类c的子类。类的事,没有接口的事。如果当前类是MemSettingsProvider,c是ISettingsProvider,则返回false。动态调用成员(*)使用备注中的Person类进行测试。调用Type的GetProperty方法可以根据属性名获得属性对象PropertyInfo,主要成员:

CanRead、CanWrite、PropertyType属性类型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。type.GetProperty(“Age”).SetValue(p1,30,null),Type、MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。调用Type的GetMethod方法可以根据方法名获得方法对象MethodBase,调用

MethodBase的Invoke方法就可以调用方法,第一个参数是实例对象,第二个参数是参数数组,如果没有参数设置为null。对Age不能SetValue(p1,"20",null)GetMethod方法默认一个string参数的方法只能获得没有重载方法的方法,要获得重载方法要用GetMethod(stringname,

Type[]types)这个重载函数,第二个参数是匹配方法的参数类型数组。Type类还有很多方法:GetConstructor(获得构造函数)、GetEvent(获得事件)、GetProperties(获得所有属性)等。(*)哪里动态了?反射的一个牛B应用调用private方法,Person

p1

=

new

Person();••••Type

type=

p1.GetType();//BindingFlags.Instance表示是实例方法,也就是不是static方法//MethodInfo

mHaha

=type.GetMethod("Haha",BindingFlags.NonPublic|BindingFlags.Instance);//mHaha.Invoke(p1,

null);数组都是从Array继承的,用反射的方法看多用断点调试,少用单步调试,单步调试

通常意味着思维很乱。F10、F11表明不知道确切的执行顺序!调试就是在期望的执

行结果和实际的执行结果进行对比,查找

不同,找到问题。”应该执行了”是期望,要用调试的方法看看到底有没有执行。编辑器插件体系(*)如鹏网项目中第三方支付、定时任务就是用的这种技术插件(Add-In、plugin):按照宿主程序的接口要求开发Assembly,然后让宿主程序加载我们编写的Assembly,这样宿主程序中就有了咱们扩展编写的代码逻辑,这样就相当于不用修改主程序的代码就可以增加新功能。查看Reflector的插件体系,添加、移除插件看菜单的变化。Reflector这种插件体系的好处就是不用把菜单项的功能在开发时写好,而是运行时动态加载,这样很容易添加新功能。编写Reflector插件参考开发自己的插件体系(代码见附件),在工具菜单下动态增加菜单项,插件放到plugins目录下。程序启动的时候动态加载所有plugins目录下的

dll插件动态构造菜单,点击菜单项的时候执行插件中定义的代码是否能开发插件、如何开发插件是由写主程序的人来决定的目录、文件(*)获得当前exe所在目录:首先用

System.Reflection.Assembly.GetExecutingAssembly().Location得到Exe的全路径,Path.GetDirectoryName得到目录路径。注意不要用Directory.GetCurrentDirectory()来获得,它是会变的。扫描目录下特定扩展名的文件:Directory.GetFiles("c:/","*.txt")动态创建菜单(*)菜单项不仅可以静态设计,也可以动态的增加。设计父菜单项,在Load事件中ToolStripItem

item=工具

ToolStripMenuItem.DropDownItems.Add("1");编写for循环添加10项响应菜单事件,item.Click+=newEventHandler(item_Click);如何点击菜单的时候知道点击的是哪个菜单?sender就是被点击的菜单项:ToolStripItem

item=sender

asToolStripItem。在添加菜单项的时候将菜单的Tag设置为序号,在item_Click从菜单项的Tag中读取即可。开发步骤(*)编写插件接口类库:定义插件接口:I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论