标签:xml
一、XML
1 什么是XML
XML全称为Extensible Markup Language,意思是可扩展的标记语言。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的
2、应用常见
<1>配置文件
<2>存放数据
3、XML语法
<1>XML文档声明
①文档声明必须为<?xml开头,以?>结束;
②文档声明必须从文档的0行0列位置开始
③文档声明只有三个属性
a)version:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0
b)encoding:指定当前文档度的编码。可选属性,默认值是utf-8
<2>元素element
①元素是XML文档中最重要的组成部分
②普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>
③元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
④空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<c/>
⑤元素命令:
a)区分大小写
b)不能使用空格,不能使用冒号;
c)不建议以XML、xml、Xml开头
⑥格式化良好的XML文档,必须只有一个根元素
<3>属性
①属性是元素的一部分,它必须出现在元素的开始标签中
②属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
③一个元素可以有0~N个属性,但一个元素中不能出现同名属性
④属性名不能使用空格、冒号等特殊字符,且必须以字母开头
<4>注释
XML的注释与HTML相同,即以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略
<5>转义字符
XML中的转义字符与HTML一样
因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:“<”、“>”、“&”
<6>CDATA区
当大量的转义字符出现在xml文件中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些
在CDATA段中出现的“<”、“>”、“&”,都无需使用转义字符,这可以提高xml文档的可读性
在CDATA段中不能包含“]]>”,即CDATA段的结束定界符
4、DTD约束
常见的xml约束:DTD、Schema
<1>什么是DTD
DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等
<2>DTD重点
开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2、hibernate等
通过提供的DTD“web-app_2_3.dtd”编写XML
<3>案列实现
①步骤1:创建web.xml,并将“web-app_2_3.dtd”拷贝相同目录下
②步骤2:从DTD文档开始处,拷贝需要的“文档声明”
③步骤3:完成xml内容编写
<4>DTD语法
①文档申明
内部DTD,在XML文档内部嵌入DTD,只对当前XML有效
外部DTD-本地DTD,DTD文档在本地系统上,公司内部自己项目使用
外部DTD-公共DTD,DTD文档在网络上,一般都有框架提供
②元素声明
实例
③属性声明
实例
5、Schema约束
<1>什么是Schema
Schema是新的XML文档约束
Schema要比DTD强大很多,是DTD替代者
Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml
Schema功能更强大,数据类型更完善
Schema支持名称空间
<2>Schema重点要求
与DTD一样,要求可以通过Schema约束文档编写xml文档。常见框架使用Schema的有:Spring等
通过提供“web-app_2_5.xsd”编写xml文档
案例文档中同一个“命令空间”分别使用“默认命令空间”和“显示命令空间”进行引入,所以文档中<schema>和<xsd:schema>作用一样
<3>案例实现
①步骤1:创建web.xml,并将“web-app_2_5.xsd”拷贝到同级目录
②步骤2:从xsd文档中拷贝需要的“命令空间”
③完成xml内容编写
<4>命令空间(语法)
①什么是命令空间
如果一个XML文档中使用多个Schema文件,而这些Schema文件定义了相同名称的元素时就会出现名字冲突,这就像一个java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了
名称空间就是用来处理元素和属性的名称冲突问题,与java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突
②约束文档和XML关系
当W3C提出Schema约束规范时,就提供“官方约束文档”。我们通过官方文档,必须“自定义schema约束文档”,开发中“自定义文档”由框架编写者提供,我们提供“自定义文档”限定,编写出自己的xml文档
③声明命令空间
实例:web-app_2_5.xsd
实例:web.xml
④其他介绍
自定义约束:web-app_2_5.xsd
xml文档:web.xml
综合案例:
综合案例目的是:一个“命令空间”必须在schemaLocation中有一个成对描述信息(名称 路径)
6、dom4j解析
<1>XML解析概述
当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用java基础所学习的IO知识是可以完成的,不过需要非常繁琐的操作才可以完成,且开发中会遇到不同的问题(只读、读写)。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML
<2>解析方式和解析器
①开发中比较常见的解析方式有三种,如下
Ⅰ、DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象
a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作
b)缺点:XML文档过大,可能出现内存溢出现象
Ⅱ、SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式 进行具体解析,每执行一行,都将触发对应的事件
a)优点:处理速度快,可以处理大文件
b)缺点:只能读,逐行后将释放资源
Ⅲ、PULL:Android内置的XML解析方式,类似SAX
②解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包
③常见的解析开发包:
a)JAXP:sun公司提供支持DOM和SAX开发包
b)JDom:dom4j兄弟
c)jsoup:一种处理HTML特定解析开发包
d)dom4j:比较常用的解析开发包,hibernate底层采用
<3>DOM解析原理及结构模型
XML DOM和HTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作
DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点
<4>API使用
如果需要使用dom4j,必须导入jar包
dom4j必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了
常用API如下:
①SaxReader对象
a)read(...)加载执行xml文档
②Document对象
a)getRootElement()获得根元素
③Element对象
a) elements(...) 获得指定名称的所有子元素。可以不指定名称
b) element(...) 获得指定名称第一个子元素。可以不指定名称
c) getName() 获得当前元素的元素名
d) attributeValue(...) 获得指定属性名的属性值
e) elementText(...) 获得指定名称子元素的文本值
f) getText() 获得当前元素的文本内容
二、反射
1、什么是反射
<1>JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一 个对象,都能够调用它的任意一个方法和属性
<2>使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段Field进行操作
2、Class对象
<1>Class对象,是对class文件(字节码文件)的描述对象
<2>获得Class对象
①已知类的完整路径名(字符串):Class.forName(...)
②已知类型:String.class,确定参数列表
③已知对象:obj.getClass()
<3>常用方法
①使用默认构造方法创建实例:newInstance()
3、Constructor对象
<1>Constructor对象,是构造方法的描述对象
<2>获得构造方法
①公共的构造方法:Constructor<T> getConstructor(Class<?>...parameterTypes),可变参数用 于确定形式参数列表
②已经声明的构造方法:
Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes),获得私有的构造
<3>实例化对象实例
①newInstance(Object...initargs),可变参数用于确定实际参数列表
4、Method对象
<1>Method对象,是普通方法的描述对象
<2>获得方法:
①获得公共方法:Method getMethod(String name,Class<?>...parameterTypes)通过方法name获得 方法,可变参数为方法的形参参数列表
②获得声明方法:Method getDeclaredMethod(String name,Class<?>...parameterType)方法操 作;
<3>执行指定方法:
①Object invoke(Object obj,Object...args)执行指定对象obj,指定方法,可变参数为方法的实 际参数列表
5、Field对象
<1>Field对象,是字段的描述对象
<2>获得方法
①所有字段:Field getField(String name),通过字段名称
②声明字段:Field getDeclaredField(String name)
<3>操作
①获得内容:Object get(Object obj)
②设置内容:void set(Object obj,Object value),确定实例对象
5、案例实现
<1>准备工作
为了模拟服务器程序,且可以同时存在多个类似程序。故提供接口,接口中有3个方法,我们人为约定三个方法的调用顺序
再为接口编写实现类
测试,创建实现类实例对象
<2>反射执行
测试程序我们直接new HelloServlet,这种编程方式我们称为硬编码,即代码写死了。为了后期程序的可扩展,开发中通常使用实现类的全限定类名(cn.itcast.e_web.HelloMyServlet),通过反射加载字符串指定的类,并通过反射创建实例
<3>解析xml
使用反射我们已经可以创建对象的实例,此时我们使用的全限定类名,但程序是仍写死了,我们将其配置到xml文档中。
xml文档内容
解析实现
<4>模拟浏览器路径
上面我们已经解析xml,不过我们获得内容是固定的。我们希望如果用户访问的路径是/hello,将执行cn.itcast_web.HelloMyServlet程序,如果访问是/hello2,将执行cn.itcast.e_web.HelloMyServlet2程序。
在执行测试程序前(@Before),解析xml文件,将解析的结果存放在Map中,map中数据的格式为:
路径=实现类
解析xml思路:先解析<servlet>,将结果存放map,name=class,然后再解析<servlet-mapping>
通过name获得class,再将url=class存放到map,最后将name=class移除
模拟浏览器请求路径,通过url从map获得class,并使用反射执行实现类
本文出自 “鹏哥的博客” 博客,谢绝转载!
标签:xml
原文地址:http://pengge666.blog.51cto.com/11766700/1976898